栈的应用举例
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
内容:数据结构实验报告课程:数据结构
班级:13物联网工程
姓名:* * *
学号:-----------------
日期:2014.10.21
实验目的:
1.熟悉C语言的基本编程方法,掌握集成编译环境的调试方法。
2.学习栈的使用方法。
3.掌握栈操作的实现方法。
4.学习使用栈解决实际问题的能力。
实验内容:
利用栈完成:1.数制转换
2.括号匹配的检验
3.行编辑程序
4.迷宫求解
5.表达式求解
五大功能模块。
**********基本操作的函数原型说明**********
Status InitStack(SqStack &s);
//构造一个空栈S
Status Destory(SqStack &s);
//销毁栈S,S不再存在
Status ClearStack(SqStack &s);
//把栈设置为空
Status StackEmpty(SqStack &s) ;
//判断栈是否为空
int StackLength(SqStack &s)
//返回栈的长度
Status GetTop(SqStack &s,SElemType &e);
//若栈不空,则用e返回S的栈顶元素,并返回OK。否则返回ERROR Status Push(SqStack &s,SElemType e)
//插入元素e为新的栈顶元素
Status Pop(SqStack &s,SElemType &e)
//若栈不空,则删除s的栈顶元素,用e返回其值,并返回ok;否则返回error
Status StackTraverse(SqStack S,Status(*visit)(SElemType))
//从栈底到栈顶依次对栈中每个元素调用函数visit()。
一旦visit()失败,则操作失败
核心代码:
数制转换:
void S_B()
{
int n;
SqStack S;
InitStack(S);
printf("请输入十进制整数n:");
scanf("%d",&n);
SElemType e;
while (n>0)
{
Push(S, n % 8);
n = n/8;
}
printf("该数的八进制数:");
while (!StackEmpty(S))
{
Pop(S,e);
printf("%d",e);
}
printf("\n");
}
括号的匹配检验:
Status EnterString(SqStack &s)
{
SElemType e;
while (1)
{
scanf("%c",&e);
if(e=='('||e=='['||e=='{')
Push(s,e);
else if(e==')'||e==']'||e=='}')
{
if(!Check(s,e))
{
return FALSE;
break;
}
}
else if(e!='\n')
{
x=1;
return FALSE;
break;
}
else
break;
}
}
行编辑程序:
void LineEdit()
{ // 利用字符栈s,从终端接收一行并送至调用过程的数据区。
char ch,c;
SqStack s;
InitStack(s);
InitStack(s);
printf(" 欢迎进入行编辑模块\n");
printf(" '#'为退格符\n");
printf(" '@'表示当前行中字符均无效\n\n");
printf(" 请输入字符:\n");
ch=getchar();
while(ch!=EOF)
{
while(ch!='\n')
{
switch(ch)
{
case '#':Pop(s,c);
break; // 仅当栈非空时退栈
case '@':ClearStack(s);
break; // 重置s为空栈
default :Push(s,ch); // 有效字符进栈
}
ch=getchar(); // 从终端接收下一个字符
}
StackTraverse(s,visit); // 将从栈底到栈顶的栈内字符输出
ClearStack(s); // 重置s为空栈
if(ch !=EOF)
ch = getchar();
}
Destory(s);
}
迷宫求解:
Status MazePath(int maze[12][12],SqStack1 &S, PosType start, PosType end) {
PosType curpos;
int curstep;
SET e;
InitStack(S);
curpos = start;
curstep = 1;
do {
if (Pass(maze,curpos))
{
Markfoot(maze,curpos);
e.di =1;
e.ord = curstep;
e.seat= curpos;
Push1(S,e);
if (curpos.row==end.row && curpos.line==end.line)
return OK;
curpos = NextPos(curpos, 1);
curstep++;
}
else
{
if (!StackEmpty(S))
{
Pop1(S,e);
while (e.di==4 && !StackEmpty(S))
{
Markfoot(maze,e.seat);
Pop1(S,e);
}
if (e.di<4)
{
e.di++;
Push1(S, e);