顺序栈

  根据《数据结构》书中的讲解,对顺序栈的一个基本实现。

define.h

 1 // define.h
 2 #ifndef __MENGQL_DEFINE__
 3 #define __MENGQL_DEFINE__
 4
 5 #define C_LOG_DBG(format, ...)
 6 //printf("[%s@%s,%d] " format ,__FUNCTION__, __FILE__, __LINE__, ##__VA_ARGS__);
 7 #define C_LOG_ERR(format, ...) printf("[%s@%s,%d] " format ,__FUNCTION__, __FILE__, __LINE__, ##__VA_ARGS__);
 8 typedef enum EStatus {ERROR, OK} Status;
 9
10 #endif

SqStack.h

 1 // SqStack.h
 2 #ifndef __SQ_STACK_H__
 3 #define __SQ_STACK_H__
 4 #include "define.h"
 5
 6 typedef struct
 7 {
 8     int x;
 9     int y;
10 }PosType;
11
12 typedef struct
13 {
14     int ord;
15     PosType seat;
16     int di;
17 }SElemType;
18
19 #define STACK_INIT_SIZE 100
20 typedef struct
21 {
22     SElemType* base;
23     SElemType* top;
24     int stacksize;
25 }SqStack;
26
27 extern Status InitStack(SqStack *S);
28 extern Status GetTopStack(SqStack S, SElemType *e);
29 extern Status PushStack(SqStack *S, SElemType e);
30 extern Status PopStack(SqStack *S, SElemType *e);
31 extern Status StackEmpty(SqStack *S);
32 extern Status DestoryStack(SqStack *S);
33 #endif

SqStack.c

 1 // SqStack.c
 2 #include "define.h"
 3 #include "SqStack.h"
 4 #include <stdlib.h>
 5 #include <stdio.h>
 6 Status InitStack(SqStack *S)
 7 {
 8     S->stacksize = STACK_INIT_SIZE;
 9     S->base = (SElemType *)malloc(S->stacksize * sizeof(SElemType));
10     if(S->base == NULL)
11     {
12         C_LOG_ERR("%s\n","MALLOC OVERFLOW!!!");
13         return ERROR;
14     }
15     S->top = S->base;
16
17     return OK;
18 }
19 Status GetTopStack(SqStack S, SElemType *e)
20 {
21     if(S.top == S.base)
22     {
23         C_LOG_ERR("%s\n","STACK IS EMPTY!!!");
24         return ERROR;
25     }
26     *e = *(S.top-1);
27     return OK;
28 }
29 Status PushStack(SqStack *S, SElemType e)
30 {
31     if(S->top - S->base >= S->stacksize)
32     {
33         S->base = (SElemType *)realloc(S->base, (S->stacksize * 2) * sizeof(SElemType));
34         if(S->base == NULL)
35         {
36             C_LOG_ERR("%s\n","REMALLOC OVERFLOW!!!");
37             return ERROR;
38         }
39         S->stacksize *= 2;
40     }
41     *(S->top++) = e;
42     return OK;
43 }
44 Status PopStack(SqStack *S, SElemType *e)
45 {
46     if(S->top == S->base)
47     {
48         C_LOG_ERR("%s\n","STACK IS EMPTY!!!");
49         return ERROR;
50     }
51     *e = *(--S->top);
52     return OK;
53 }
54 Status StackEmpty(SqStack *S)
55 {
56     if(S->top == S->base)
57     {
58         return OK;
59     }
60     return ERROR;
61 }
62 Status DestoryStack(SqStack *S)
63 {
64     S->stacksize = 0;
65     free(S->base);
66     S->top = S->base = NULL;
67     return OK;
68 }

迷宫求解 

  顺序栈实现的迷宫求解是深度优先搜索,得出的路径是非最短路径。

测试用例 1
8 8
0 0 1 0 0 0 1 0
0 0 1 0 0 0 1 0
0 0 0 0 1 1 0 0
0 1 1 1 1 0 0 0
0 0 0 1 0 0 0 0
0 1 0 0 0 1 0 0
0 1 1 1 0 1 1 0
1 0 0 0 0 0 0 0 

Maze.c

//Maze.c
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
#include "define.h"
#include "SqStack.h"int **g_MazeMap;
int g_m, g_n;//g_m:列数 g_n:行数#define FAILEDPOS 5
#define FOOTPRINT 2void MazePrint()
{int i, j;for(i=0; i<g_m; ++i){for(j=0; j<g_n; ++j){printf("%d ", g_MazeMap[i][j]);}printf("\n");}
}void MazePrintRes(SqStack *S)
{SElemType e;if(StackEmpty(S) == OK){return;}else{PopStack(S, &e);MazePrintRes(S);printf("[%d][%d, %d]\n", e.ord, e.seat.x, e.seat.y);}
}Status MazePass(PosType pos)
{if(pos.x>=0 && pos.y>=0 && pos.x<g_m && pos.y<g_n && g_MazeMap[pos.y][pos.x] == 0){return OK;}return ERROR;
}
void MazeFootPrint(PosType pos)
{g_MazeMap[pos.y][pos.x] = FOOTPRINT;
}
void MarkPrint(PosType pos)
{g_MazeMap[pos.y][pos.x] = FAILEDPOS;
}
void NextPos(PosType *pos, int di)
{switch(di){case 1:pos->y = pos->y-1;break;case 2:pos->x = pos->x-1;break;case 3:pos->y = pos->y+1;break;case 4:pos->x = pos->x+1;break;defult:break;}
}
/*
DFS, use stack, is not shortest path
*/
Status MazePath(PosType *start, PosType *end)
{SqStack S;int nCurStep = 1;PosType curPos;SElemType e;curPos.x = start->x;curPos.y = start->y;if(InitStack(&S) != OK){return ERROR;}do{if(MazePass(curPos) == OK){MazeFootPrint(curPos);e.ord = nCurStep;e.di = 1;e.seat.x = curPos.x;e.seat.y = curPos.y;PushStack(&S, e);if(curPos.x == end->x && curPos.y == end->y){MazePrintRes(&S);MazePrint();return OK;}NextPos(&curPos, e.di);nCurStep++;}else{if(StackEmpty(&S) != OK){PopStack(&S, &e);C_LOG_DBG("[%d][%d][%d]\n", e.seat.x, e.seat.y, e.di);while(e.di>=4 && StackEmpty(&S)!=OK){MarkPrint(e.seat);PopStack(&S, &e);}C_LOG_DBG("[%d][%d][%d]\n", e.seat.x, e.seat.y, e.di);if(e.di < 4){e.di++;PushStack(&S, e);NextPos(&e.seat, e.di);curPos.x = e.seat.x;curPos.y = e.seat.y;}}}}while(StackEmpty(&S) != OK);DestoryStack(&S);return ERROR;
}
/*
如果要输出最短路径,还需要进一步处理
*/
int main()
{PosType start;PosType end;int i, j;scanf("%d %d", &g_m, &g_n);start.x = 0;start.y = 0;end.x = g_m-1;end.y = g_n-1;g_MazeMap=(int**)malloc(g_m*sizeof(int*));for(i=0; i<g_m; ++i){g_MazeMap[i] = (int*)malloc(g_n*sizeof(int));}for(i=0; i<g_m; ++i){for(j=0; j<g_n; ++j){scanf("%d", &g_MazeMap[i][j]);}}MazePath(&start, &end);return 0;
}

输出结果:

[1][0, 0]
[2][0, 1]
[3][0, 2]
[4][0, 3]
[5][0, 4]
[8][1, 4]
[9][2, 4]
[10][2, 5]
[11][3, 5]
[12][4, 5]
[13][4, 4]
[14][5, 4]
[15][5, 3]
[16][6, 3]
[17][6, 2]
[18][7, 2]
[21][7, 3]
[22][7, 4]
[23][6, 4]
[24][6, 5]
[25][7, 5]
[26][7, 6]
[27][7, 7]
2 0 1 0 0 0 1 5
2 0 1 0 0 0 1 5
2 0 0 0 1 1 2 2
2 1 1 1 1 2 2 2
2 2 2 1 2 2 2 2
5 1 2 2 2 1 2 2
5 1 1 1 0 1 1 2
1 0 0 0 0 0 0 2 

  从结果可以看出,走了很多弯路。如果改用队列实现BFS就可以直接得出最短路径。

转载于:https://www.cnblogs.com/favourmeng/archive/2012/08/22/2650555.html

顺序栈和迷宫求解(C语言)相关推荐

  1. C语言用栈实现迷宫求解

    大学的实训课,要求做一个迷宫,其中墙用1标注,通路用0标注,然后寻找一个从默认起点1,1到默认终点8,8的通路.发现网上有好多类似的其实都用不了,于是乎自己缝缝补补出了一个能用的,注解写的比较全,可以 ...

  2. java使用链栈实现迷宫求解

    java实现链栈在前面有所介绍:http://www.cnblogs.com/lixiaolun/p/4644141.html java实现链栈的代码: package stackapplicatio ...

  3. 【数据结构】顺序栈的实现(C语言)

    栈的基本概念及其描述 栈是一种特殊的线性表,规定它的插入运算和删除运算均在线性表的同一端进行,进行插入操作和删除操作的那一端称为栈顶,另一端称为栈底. 栈的插入操作和删除操作分别称为进栈和出栈. FI ...

  4. 顺序栈十进制转八进制C语言,顺序栈实现十进制跟八进制之间的转换

    顺序栈实现十进制和八进制之间的转换 顺序栈实现十进制和八进制之间的转换 (1)首先实现栈的初始化,既申请固定大小的数组空间,存储数据,用到的方法是 int InitStack(  struct  sq ...

  5. 二维数组迷宫求解c语言,c语言写的迷宫问题

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 下面是程序 #include #define OVERFLOW -2 #define ERROR 0 #define NULL 0 #define tru ...

  6. C语言 迷宫问题求解(顺序栈应用示例)

    [cpp] view plaincopy //顺序栈的应用:迷宫 //作者:nuaazdh //时间:2011年12月7日 #include <stdio.h> #include < ...

  7. 数据结构《顺序栈》知识点详解+C语言完整代码-超详细

    顺序栈 栈 1. 定义 2. 逻辑结构 3. 存储结构 4. 运算规则 5. 实现方式 C语言代码实现 1. 顺序栈的表示 2. 结构体 3.初始化 4.入栈 5.出栈 6. 取栈顶元素 7.求长 8 ...

  8. c语言迷宫游戏怎么存放坐标,求解迷宫问题(c语言,很详细哦

    <求解迷宫问题(c语言,很详细哦>由会员分享,可在线阅读,更多相关<求解迷宫问题(c语言,很详细哦(5页珍藏版)>请在人人文库网上搜索. 1.求迷宫问题就是求出从入口到出口的路 ...

  9. c语言迷宫问题输出坐标,C语言数据结构之迷宫求解问题

    现在网上各种对于迷宫的求解,版本多的数不胜数.本人小白一枚,贴上自己对迷宫的求解这个小项目,自己写的.望能帮助一些同样有困难的人,毕竟我当时费解了好一会儿时间呢. 首先,先标明对于迷宫求解这个项目,首 ...

  10. 栈和队列求解迷宫问题(数据结构学习笔记)

    文章目录 迷宫问题 "栈"求解迷宫问题 行走规则 算法思路 算法代码 栈的定义 算法设计 完整代码 最终迷宫路径 算法总结 "队列"求解迷宫问题 算法思路 算法 ...

最新文章

  1. Embarcadero公司花2千3百万买下Borland的开发工具业务
  2. shiro+redis实现session共享
  3. 一个简单的配置管理器(SettingManager)
  4. 【人脸识别】初识人脸识别
  5. 线程同步,线程不同步_重新同步多线程集成测试
  6. SQL Server 2008:示例数据库安装
  7. python办公入门经典_Python3入门经典100例
  8. 泵车砼活塞故障预警-冠军方案
  9. vb利用计算机 鸡兔同笼,VB程序题:利用计算机解决古代数学瓿“鸡兔同笼问题”。即已知在同一笼子里有总数为m只鸡和兔,鸡和兔的总脚数为n只,求鸡和兔各有多少只? VB源码 龚沛曾...
  10. NOIP2013华容道
  11. 一种APP和微信远程组态监控台达PLC的方案
  12. 自然语言处理入门(4)——中文分词原理及分词工具介绍
  13. HTML中font标签用法
  14. 向量正交 与 函数正交
  15. 问题 - GitLab repositories 文件夹权限异常
  16. 第八章、使用matplotlib绘制高级图表
  17. 你觉得程序员最需要具备哪些软技能?
  18. linux更新网卡驱动版本,Linux中升级网卡驱动
  19. 《工业控制网络安全技术与实践》一第1章 绪  论
  20. iOS Facebook第三方登录

热门文章

  1. MFC中给对话框重绘边框
  2. Java编程思想笔记(内部类)
  3. Web前端学习-第一课JavaScript篇
  4. ASP获得上个月、本月、下个月的第一天和最后一天的代码
  5. Effective C# Item47:选择安全代码
  6. 调用未知DLL中的导出函数[转]
  7. RawNet代码解析
  8. Saiku2.6 配置数据源
  9. Java学习笔记——final
  10. Linux下安装和卸载jdk步骤详述