数据结构快速回顾——栈

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

 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-cn");   
 44     printf("MazePsth-cn");   
 45     printf("PrintMaze-cn");   
 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

 

 

Published by

风君子

独自遨游何稽首 揭天掀地慰生平