堆栈,也可直接称栈,是一种特殊的串行形式的数据结构,它的特殊之处在于只能允许在链结串行或阵列的一端进行加入资料和输出资料的运算。另外堆栈也可以用一维阵列或连结串行的形式来完成。

 1 #define STACK_INIT_SIZE 100
 2 #define STACKINCREMENT    10
 3
 4 typedef  struct
 5 {  int* top;
 6    int* base;
 7    int stacksize;
 8 }SqStack;
 9
10 int InitStack(SqStack &S)
11 {
12     S.base = (int*)malloc(sizeof(int)*STACK_INIT_SIZE);
13     if(!S.base)exit(1);//分配内存失败
14     S.stacksize = STACK_INIT_SIZE;
15     S.top = S.base;
16     return 1;
17 }
18 //栈顶插入
19 int Push(SqStack &S,int e)
20 {
21     if(S.top - S.base >= S.stacksize)
22     {
23         S.base = (int*)realloc(S.base,(S.stacksize+STACKINCREMENT)*sizeof(int));
24         if(!S.base)exit(1);//分配内存失败
25         S.top = S.base+S.stacksize;
26         S.stacksize += STACKINCREMENT;
27     }
28     *S.top++ = e;
29     return 1;
30 }
31 int Pop(SqStack &S,int &e)
32 {
33     if(S.top == S.base)
34         return 0;
35     e = *--S.top;
36     return 1;
37 }

迷宫求解问题实现:

  1 // mazepath.cpp : Defines the entry point for the console application.
  2 //
  3
  4 #include "stdafx.h"
  5 #include "stdio.h"
  6 #include "stack.h"
  7 #include "malloc.h"
  8
  9 #define RANGE 10    //设置数组的最大长度
 10
 11
 12 typedef int DirectType;
 13
 14 typedef struct {
 15     int r,c;    //迷宫中r行c列的位置
 16 }PosType;
 17
 18 typedef struct {
 19     int row,col;
 20     char arr[RANGE][RANGE];//各位置取值' ','#','@'或'*'   其中#表示墙壁 @表示走不通的节点 *表示走过的节点
 21 }MazeType;
 22
 23
 24 typedef struct {
 25     int step;           //当前位置在路径上的“序号”
 26     PosType seat;       //当前的坐标位置
 27     DirectType di;      //往下一坐标位置的方向
 28 }ElemType;              //栈的元素类型
 29
 30
 31 typedef struct NodeType {
 32     ElemType data;
 33     struct NodeType *next;
 34 }NodeType,*LinkType;    //结点类型,指针类型
 35
 36 typedef struct {
 37     LinkType top;
 38     int size;
 39 }Stack;                 //栈类型
 40
 41
 42 void Initialization(){
 43     printf("CreatMaze-c\n");
 44     printf("MazePsth-c\n");
 45     printf("PrintMaze-c\n");
 46 }
 47
 48 void MakeNode(LinkType &p,ElemType e){
 49     p=(LinkType)malloc(sizeof(NodeType));
 50     p->data.step=e.step;
 51     p->data.seat.r=e.seat.r;
 52     p->data.seat.c=e.seat.c;
 53     p->data.di=e.di;
 54 }
 55 //标记走过的节点
 56 void FootPrint(MazeType &Maze,PosType curpos){
 57     Maze.arr[curpos.r][curpos.c]='*';
 58 }
 59
 60 int Pass(MazeType &Maze,PosType curpos){
 61     if(Maze.arr[curpos.r][curpos.c]=='#'||Maze.arr[curpos.r][curpos.c]=='@')
 62         return 0;
 63     else return 1;
 64 }
 65
 66
 67
 68 void CreateMaze(MazeType &Maze){
 69     int i,j;
 70     printf("产生迷宫:输入迷宫的大小\n");
 71     printf("行:\n");
 72     scanf("%d",&Maze.row);
 73     printf("列:\n");
 74     scanf("%d",&Maze.col);
 75     //给迷宫四周加障碍
 76     for(i=0;i<=Maze.row+1;i++)
 77         for(j=0;j<=Maze.col+1;j++)
 78             if(i==0||i==Maze.row+1)Maze.arr[i][j]='#';
 79             else if(j==0||j==Maze.col+1)Maze.arr[i][j]='#';
 80             else Maze.arr[i][j]=' ';
 81     //接收障碍位置
 82     printf("如果设置障碍结束,请输入“q”,否则输入障碍所在行\n");
 83     scanf("%d",&i);
 84     while(i!='q'){
 85         printf("输入障碍所在列\n");
 86         scanf("%d",&j);
 87         Maze.arr[i][j]='#';
 88         printf("如果设置障碍结束,请输入“q”,否则输入障碍所在行\n");
 89         scanf("%d",&i);
 90     }
 91 }
 92 //标记四个方向都走不通的节点
 93 void MakePrint(MazeType &Maze,PosType curpos){
 94     Maze.arr[curpos.r][curpos.c]='@';
 95 }
 96
 97
 98 void NextPos(PosType &curpos,DirectType di){
 99     switch(di){
100     case 1:curpos.c++;break;
101     case 2:curpos.r++;break;
102     case 3:curpos.c--;break;
103     case 4:curpos.r--;break;
104     }
105 }
106
107
108
109 void PrintMaze(MazeType Maze){
110     int i,j;
111     for(i=1;i<=Maze.row;i++){
112         for(j=1;j<=Maze.col;j++){
113             printf("%c",Maze.arr[i][j]);
114         }
115         printf("\n");
116     }
117
118
119
120 int MazePath(MazeType Maze,PosType start,PosType end){
121     PosType curpos;
122     ElemTpye e;
123     int curstep=1,found=0;
124     InitStack(S);
125     curpos=start;
126     do{
127         if(Pass(Maze,curpos)){
128             FootPrint(Maze,curpos);
129             e.step=curstep;
130             e.seat=curpos;
131             e.di=1;
132             Push(S,e);
133             if(curpos==end)found=1;
134             else {
135                 curpos=NextPos(curpos,1);
136                 curstep++:
137             }//else
138         }//if
139         else
140             if (!StackEmpty(S)){
141                 Pop(S,e);
142                 while(e.di==4&&!StackEmpty(S)){
143                     MarkPrint(Maze,e.seat);
144                     Pop(S,e);
145                     curstep--;
146                 }//while
147                 if(e.di<4){
148                     e.di++;
149                     Push(S,e);
150                     curpos=NextPos(e.seat,e.di);
151                 }//if
152             }//if
153     }while(!StackEmpty(S)&&!found);
154     return found;
155 }//Mazepath

数据结构快速回顾——栈相关推荐

  1. 2021年大数据Spark(四十二):SparkStreaming的Kafka快速回顾与整合说明

    目录 Kafka快速回顾 消息队列: 发布/订阅模式: Kafka 重要概念: 常用命令 整合说明 两种方式 两个版本API 在实际项目中,无论使用Storm还是SparkStreaming与Flin ...

  2. 数据结构快速盘点 - 非线性结构

    PS:为了更好的阅读体验,推荐阅读原文,到我的博客中阅读. 那么有了线性结构,我们为什么还需要非线性结构呢? 答案是为了高效地兼顾静态操作和动态操作.大家可以对照各种数据结构的各种操作的复杂度来直观感 ...

  3. 数据结构遍历顺序栈_数据结构:顺序栈的实现

    数据结构:顺序栈的实现 1.快速开始 栈是一种遵循元素后进(Push)先出(Pop)规则的线性表,即最后加入的元素最先出来,它的实现可以用数组或者链表. 它的特点如下: 后入先出,先入后出. 除了头尾 ...

  4. 《JavaScript快速全栈开发》作者Azat Mardanov:现在是拥抱Node技术栈的最佳时机

    非商业转载请注明作译者.出处,并保留本文的原始链接:http://www.ituring.com.cn/article/195742 Azat Mardanov是一位有着12年开发经验的资深软件工程师 ...

  5. SDUT-2449_数据结构实验之栈与队列十:走迷宫

    数据结构实验之栈与队列十:走迷宫 Time Limit: 1000 ms Memory Limit: 65536 KiB Problem Description 一个由n * m 个格子组成的迷宫,起 ...

  6. sdut 2088 数据结构实验之栈与队列十一:refresh的停车场

    数据结构实验之栈与队列十一:refresh的停车场 Time Limit: 1000MS Memory Limit: 65536KB Submit Statistic Discuss Problem ...

  7. sdut 1479 数据结构实验之栈与队列九:行编辑器

    数据结构实验之栈与队列九:行编辑器 Time Limit: 1000MS Memory Limit: 65536KB Submit Statistic Discuss Problem Descript ...

  8. sdut 3335 数据结构实验之栈与队列八:栈的基本操作

    数据结构实验之栈与队列八:栈的基本操作 Time Limit: 1000MS Memory Limit: 65536KB Submit Statistic Discuss Problem Descri ...

  9. sdut 3333 数据结构实验之栈与队列六:下一较大值(二)

    数据结构实验之栈与队列六:下一较大值(二) Time Limit: 150MS Memory Limit: 8000KB Submit Statistic Discuss Problem Descri ...

最新文章

  1. 3线程的终止方式,线程属性,NPTL
  2. Android开发之品牌机型不同setMargins属性无效的bug
  3. 11.乘最多水的容器
  4. Handler处理器 和 自定义Opener
  5. 一建管道工程122知识点_背诵的知识点是否边缘化?一建市政一本通+学霸笔记,教你只记重点...
  6. vue怎么vw布局好用_Vue项目中使用vw实现移动端适配-阿里云开发者社区
  7. 京东:618 期间遭「黑公关」恶意抹黑;Adobe 回应“杀死Flash”;Bootstrap 5.0 Alpha 发布 |...
  8. Fiddler改包场景2——拦截请求,修改响应,放行请求
  9. php 保护变量,PHP安全:变量的前世今生
  10. JavaScript监听手机物理返回键的两种解决方法
  11. 可拖动jquery插件
  12. SWPUACM第一届程序设计大赛
  13. JS学习总结(14)——Events事件
  14. Matlab中的滤波器
  15. python 课程设计扫雷报告_《扫雷课程设计报告.doc
  16. HUSTOJ随笔3-配置文件
  17. 2020 阿里、字节iOS面试题之Runtime相关问题2
  18. 给游戏编个故事:《通关游戏设计之道》
  19. Unreal Engine 4 学习总动员读书笔记
  20. [笔记分享] [Camera] MTK Camera基础知识二

热门文章

  1. 交换机调试工具_工业以太网交换机安装流程图解
  2. 14大招打造你的平面设计创意
  3. svnadmin: e000002: 无法创建最上层目录_JFolder::create: 无法创建目录
  4. 华为云计算之存储的分类
  5. java 复制一个数组_浅谈Java中复制数组的方式
  6. python安装包之后仍提示_解决已经安装requests,却依然提示No module named requests问题...
  7. mysql回收权限_mysql回收权限不成功,请问如何破?
  8. php return 返回html_【php socket通讯】php实现http服务
  9. electron——初探
  10. 隐马尔可夫(HMM)、前/后向算法、Viterbi算法