数据结构快速回顾——栈

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


 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

数据结构快速回顾——栈,布布扣,bubuko.com

时间: 2024-10-08 15:21:03

数据结构快速回顾——栈的相关文章

数据结构快速回顾——图的遍历

图的遍历指的是从图中的任一顶点出发,对图中的所有顶点访问一次且只访问一次.图的遍历操作和树的遍历操作功能相似.图的遍历是图的一种基本操作,图的许多其它操作都是建立在遍历操作的基础之上. 图的遍历方法目前有深度优先搜索法和广度(宽度)优先搜索法两种算法. 深度优先搜索法DFS 深度优先搜索法的基本思想是:从图G的某个顶点v0出发,访问v0,然后选择一个与v0相邻且没被访问过的顶点vi访问,再从vi出发选择一个与vi相邻且未被访问的顶点vj进行访问,依次继续.如果当前被访问过的顶点的所有邻接顶点都已

数据结构快速回顾——二叉树 解幂子集问题

回溯法是设计递归的一种常用方法,它的求解过程实质上就是一个先序遍历一棵"状态树"的过程,只是这棵树不是遍历前预先建立的而是隐含在遍历过程中的. 下面举一个例子:求含n个元素的集的幂集:集合A={ {1,2,3}, {1,2}, {1,3}, {1}, {2,3},{2},{3},{}}; //{}表示空集合从集合A的每一个元素的角度看,它只有两种状态:或者是属于幂集的元素集,或不属于幂集元素集,则求幂集的过程就可以看成是依次对集合A中的元素进行"取","舍

数据结构快速回顾——二叉树

二叉树(Binary Tree)是个有限元素的集合,该集合或者为空.或者由一个称为根(root)的元素及两个不相交的.被分别称为左子树和右子树的二叉树组成.当集合为空时,称该二叉树为空二叉树.在二叉树中,一个元素也称作一个结点. 基本概念: (1)结点的度.结点所拥有的子树的个数称为该结点的度. (2)叶结点.度为0的结点称为叶结点,或者称为终端结点. (3)分枝结点.度不为0的结点称为分支结点,或者称为非终端结点.一棵树的结点除叶结点外,其余的都是分支结点. (4)左孩子.右孩子.双亲.树中一

数据结构快速回顾——平衡二叉树 AVL (转)

平衡二叉树(Balanced Binary Tree)是二叉查找树的一个进化体,也是第一个引入平衡概念的二叉树.1962年,G.M. Adelson-Velsky 和 E.M. Landis发明了这棵树,所以它又叫AVL树.平衡二叉树要求对于每一个节点来说,它的左右子树的高度之差不能超过1,如果插入或者删除一个节点使得高度之差大于1,就要进行节点之间的旋转,将二叉树重新维持在一个平衡状态.这个方案很好的解决了二叉查找树退化成链表的问题,把插入,查找,删除的时间复杂度最好情况和最坏情况都维持在O(

数据结构快速回顾——二叉查找树

二叉查找树(Binary Search Tree),也称有序二叉树(ordered binary tree),排序二叉树(sorted binary tree),是指一棵空树或者具有下列性质的二叉树: 若任意节点的左子树不空,则左子树上所有结点的值均小于它的根结点的值: 任意节点的右子树不空,则右子树上所有结点的值均大于它的根结点的值: 任意节点的左.右子树也分别为二叉查找树. 没有键值相等的节点(no duplicate nodes). 二叉查找树相比于其他数据结构的优势在于查找.插入的时间复

数据结构快速回顾——开篇

六月到了.开始找工作的节奏,IT方面知识储备严重欠缺,定计划,更新博客,记录自己的准备历程. 1.数据结构 15天 2.常用算法(排序.动态规划.贪心等) 30天 3.数据挖掘算法 15天 4.移动端.web端开发入门 15天 5.操作系统 10天 共计85天,那时将近9月,还能赶上找工作的大潮. 何为数据结构?数据结构用处?一般来说,使用计算机解决一个问题的时候需要经历以下步骤:分析问题.抽象出数学模型.设计解数学模型的算法.写程序.测试.得到最终结果.为了解决非数值型数学模型,需要使用诸如表

javascript数据结构与算法---栈

在上一遍博客介绍了下列表,列表是最简单的一种结构,但是如果要处理一些比较复杂的结构,列表显得太简陋了,所以我们需要某种和列表类似但是更复杂的数据结构---栈.栈是一种高效的数据结构,因为数据只能在栈顶添加或删除,所以这样操作很快,而且容易实现. 一:对栈的操作. 栈是一种特殊的列表,栈内的元素只能通过列表的一端访问,这一端陈为栈顶.比如餐馆里面洗盘子,只能先洗最上面的盘子,盘子洗完后,也只能螺到这一摞盘子的最上面.栈被称为 "后入先出"(LIFO)的数据结构. 由于栈具有后入先出的特点

数据结构实验之栈:进制转换

            数据结构实验之栈:进制转换 输入一个十进制整数,将其转换成对应的R(2<=R<=9)进制数,并输出. 输入 第一行输入需要转换的十进制数:第二行输入R. 输出 输出转换所得的R进制数. 模板: while(n!=0) { mod = n%r; q[i++] = mod;//i初始化为0 n/=r; }  

数据结构实验之栈:行编辑器

数据结构实验之栈:行编辑器 题目描述 一个简单的行编辑程序的功能是:接受用户从终端输入的程序或数据,并存入用户的数据区. 由于用户在终端上进行输入时,不能保证不出差错,因此,若在编辑程序中,“每接受一个字符即存入用户数据区”的做法显然不是最恰当的.较好的做 法是,设立一个输入缓冲区,用以接受用户输入的一行字符,然后逐行存入用户数据区.允许用户输入出差错,并在发现有误时可以及时更正.例如,当用户发现刚 刚键入的一个字符是错的时,可补进一个退格符"#",以表示前一个字符无效: 如果发现当前