栈的应用举例

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

void conversion ( ) {
//对于输入的任意一个非负十进制整数,
//打印输出与其等值的八进制数。
InitStack (S);
//构造空栈
scanf (“%d”, N);
while (N) {
Push Biblioteka BaiduS, N%8);
N = N / 8;
}
while (!StackEmpty(s)) {
£3.2 栈的应用举例
£3.2.1 数制转换
十进制数N和其他d进制数的转换是计算机实现计算的基本问题,其解决 方法很多,其中一个简单算法基于下列原理:
N = ( N div d ) × d + N mod d (其中:div为整除运算,mod为求余运算)
例如:(1348)10=(2504)8,其运算过程如下:
N
N div 8
N mod 8
1348
168
4
168
21
0
21
2
5
2
0
2
由于上述计算过程是从低位到高位顺序产生八进制数的 各个数位,而打印输出,一般来说应从高位到低位进行,恰 好和计算过程相反。因此,若计算过程中得到八进制数的各 位顺序进栈,则按出栈序列打印输出的即为与输入对应的八 进制数。
算法3.1如下:
//从终端接收下一个字符
}
将从栈底到栈顶的栈内字符传送至调用过程的数据区;
ClearStack (S);
//重置S为空栈
if (ch != EOF)
ch = getchar ( );
}
DestroyStack (S);
} //LineEdit
£3.2.4 迷宫求解
入口 012 34 56 789
空白方块:表示通道。
switch (ch) {
case ‘#’:Pop (S, c);
break; //仅当栈非空时退栈
case’@’:ClearStack (S); break; //重置S为空栈
default:Push (S, ch);
break; //有效字符进栈,
//未考虑栈满情况
}
ch = getchar ( );
Status matching(string& exp) { int state = 1; while (i<=Length(exp) && state) { switch of exp[i] { case “(”:{Push(S,exp[i]); i++; break;} case”)”: { if(NOT StackEmpty(S)&&GetTop(S)=“(“ {Pop(S,e); i++;} else {state = 0;} break; } … … } if (StackEmpty(S)&&state) return OK; …...
的期待的急迫性都降了一级。另外,在算法的开始和结束时,栈都应该是空的。
算法的设计思想:
1)凡出现左括弧,则进栈;
2)凡出现右括弧,首先检查栈是否空 若栈空,则表明该“右括弧”多余 否则和栈顶元素比较, 若相匹配,则“左括弧出栈” 否则表明不匹配
3)表达式检验结束时, 若栈空,则表明表达式中匹配正确 否则表明“左括弧”有余
为了提高程序的效率,我们设立一个输入缓冲区,
putchar (*s ++); 用以接受用户输入的一行字符,然后逐行存入用户数
据区。在此,将这个输入缓冲区设为一个栈结构,每
当从终端接受了一个字符之后先作如下判断:
①如果它既不是退格符也不是退行符,则将该字符 压入栈顶;
②如果是一个退格符,则从栈顶删去一个字符; ③如果它是一个退行符,则将字符栈清为空栈。
£3.2.3 行编辑程序
功能:接受用户从终端输入的程序或数据,并存入用户的数据区。 退格符“#”:表示前一个字符无效。 退行符“@”:表示当前行中的字符均无效。
例如:
whli # # ilr # e(s # *s)
outcha@putchar (*s = # ++);
等效为:
while (* s)
设定当前位置的初值为入口位置;
do {
若当前位置可通,
则{ 将当前位置插入栈顶;
//纳入路径
若该位置是出口位置,则结束;
[([][])] 1234 567 8
当计算机接受了第一个括号后,它期待着与其匹配的第八个括号的出现,然 而等来的却是第二个括号,此时第一个括号“[”只能暂时靠边,而迫切等待与 第二个括号相匹配的、第七个括号”)”的出现,类似的,因等来的是第三个括号 “[”,其期待匹配的程度较第二个括号更急迫,则第二个括号也只能靠边,让 位于第三个括号,显然第二个括号的期待急迫性高于第一个括号;在接受了第 四个括号之后,第三个括号的期待得到满足,消解之后,第二个括号的期待匹 配就成为当前最急迫的任务了,……,依次类推。可见,这个处理过程恰与栈 的特点相吻合。由此,在算法中设置一个栈,每读入一个括号,若是右括号, 则或者使置于栈顶的最急迫的期待得以消解,或者是不合法的情况;若是左括 号,则作为一个新的更急迫的期待压入栈中,自然使原有的栈中的所有未消解
算法3.2如下:
void LineEdit {//利用字符栈S,从终端接收一行并传送至调用过程的数据区。
InitStack (S);
//构造空栈S
ch = getchar ();
//从终端接收第一个字符
while (ch != EOF) {
//EOF为全文结束符
while (ch != EOF && ch ! = ‘\n’) {
带阴影线的方块:表示墙。
出口
图3.4 迷宫 当前位置:指在搜索过程中某一时刻所在图中某个方块位置。 下一位置:指“当前位置”四周4个方向(东、南、西、北) 上相邻的方块。
当前位置可通:指未曾走到过的通道块。即要求该方块位置不仅 是通道块,而且既不在当前路径上,也不是曾经 纳入过路径的通道块。
求迷宫中一条从入口到出口的路径的算法可简单描述如下:
Pop (S, e);
printf (“%d”, e);
}
} //conversion
£3.2.2 括号匹配检验
假设表达式中允许包含两种括号:圆括号和方括号,其嵌套 的顺序随意,即( [ ] ( ))或[( [ ] [ ]) ]等为正确的格式,[ ( ] )或[ ( ) ) 或( ( ) ] )均为不正确的格式。检验括号是否匹配的方法可用“期待 的急迫程度”这个概念来描述。例如:
相关文档
最新文档