数据结构栈的应用本

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

void LineEdit(){ InitStack(S); //缓存栈S ch=getchar(); while (ch != EOF) { //EOF为全文结束符 while (ch != EOF && ch != '\n') { switch (ch) { case '#' : Pop(S, c); break;
// 重置S为空栈
case '@': ClearStack(S); break; default : Push(S, ch); break; } ch = getchar(); // 接收本行下一个字符 }
将从栈In底itS到t栈ac顶k(的S2字);符. /传/辅送助至栈S调2用过程的数据区; while(!EmptyStack(S)){ //从S栈出来,进入S2
把N与8求余得到的八进制数压入栈S;N更 新为N与8的商。
3.当栈S非空时,循环执行以下操作: 弹出栈顶元素e,然后输出e。
void conversion () { InitStack(S); scanf ("%d",&N); while (N) { Push(S, N % 8); N = N/8; } while (!StackEmpty(S)) { Pop(S,e); printf ( "%d", e ); }
case ‘]’: { if( !StackEmpty(S)&&GetTop(S) ==‘[‘) {Pop(S,e); } else {state = 0;} break;
} ch=getchar(); } if (StackEmpty(S)&&state)
return OK; else
return ERROR; }
可以P借o助p(S另,e一); 个辅助栈来完成
Push(S2,e); } while(!EmptyStack(S2)){
Pop(S2,e); 将e写入用户数据区 } ClearStack(S); ClearStack(S2); if (ch != EOF) ch = getchar(); //读取下一行字符 } DestroyStack(S); DestroyStack(S2);
的优先级时,则取出栈S2的栈顶和次栈顶的两个元素以及
源自文库
栈S1的栈顶运算符,进行相应的运算,并将结果放入栈S2
中;
如此下去,直至ch的优先级高于S1栈顶运算符的优先级, 将ch入S1栈。
OperandType EvaluateExpression( ) { InitStack(S1); Push(S1, #); InitStack(S2); c=getchar(); while (c!=‘#’||GetTop(S1)!=‘#’) { if (!In(c, OP)) {Push(S2,c) ;c=getchar();}
第三章 栈的应用
数制转换
算法基于原理 “除基取余法”
除以基数取余数,逆序排列。
例如:(1348)10 = (2504)8 , 其运算过程如下:
N N div 8
计 1348 168
算 顺 序
168 21
21 2
2
0
N mod 8
4

0 5
出 顺 序
2
进制转换算法思想
1.初始化一个空栈S; 2.当十进制数N非零时,循环执行以下操作:
} // conversion
余数入栈 余数出栈
括号匹配
括号匹配问题
1.括号匹配
{ [ ( ) ] }, ( ( ) { } ), ( )
2.括号不匹配 [ ( ] ), ( [ ( ) ), ( ( ) ] )
检验括号匹配的方法:“期待的急迫程度”
检查括号匹配算法的设计思想
设一栈; 遇到左括号则入栈; 遇到右括号时,若栈空,则不匹配(右括
三种表达式的特点
操作数之间的相对次序不变; 运算符的相对次序可能不同; 中缀式必须有括号信息,否则运算顺序改变; 前缀式:无括号;连续出现的两个操作数和在它 们之前出现且紧靠它们的运算符构成了一个最小 表达式; 后缀式:无括号;运算符的排列顺序就是计算顺 序,每个运算符加上在它之前且紧靠它的两个操 作数构成了一个最小表达式。
(算术)表达式求值
算术表达式的组成
常量、变量、 函数、表达式
操作数(运算对象或运算量)
运算符
单目、双 目
以+、-、*、/四种运算为例
界限符(如圆括号,作用是改变运算次序)
算术表达式的分类
根据运算符在表达式中的不同位置
中缀表达式 后缀表达式 前缀表达式
例:表达式3 * ( 5 – 2 )
3*(5–2) 352-* *3–52
号太多),否则,如果栈顶元素与该右括 号匹配,则出栈,否则不匹配(括号不配 对)。 输入结束后,若栈为空,则匹配,否则 不匹配(左括号太多)。
Status Matching(){ int state = 1; InitStack(S); ch=getchar(); while (ch!=‘#’ && state) { switch(ch) { case ‘(‘||’[’:{Push(S, ch); break;} case ‘)’: { if(!StackEmpty(S)&&GetTop(S)==‘(‘) {Pop(S,e); } else {state = 0;} break; }
则实际有效的是下列两行: while (*s) putchar(*s++);
行编辑程序算法的设计思想
设一栈(输入缓冲区); 读入的字符为退格符,则删除栈顶字符; 读入的字符为退行符,则清空栈; 否则,读入的字符入栈。 每处理完一行字符,将栈底到栈顶的字符
存入存储器,清空栈,开始进行下一行的 字符处理,直到文件结束。
中缀表达式求值
设置两个工作栈:运算符栈S1和操作数栈S2。S2也放表达 式的运算结果。
算法思想
1 、首先置操作数栈S2为空栈,置运算符栈S1的栈底为表达 式的起始符 # (优先级最低)。
2 、依次读入表达式中的每个字符ch,直至表达式结束:
若ch是操作数,则进S2栈;
若ch是运算符,若其优先级不高于S1栈顶运算符
行编辑程序
出现的问题
每接受一个字符立即存入存储器吗? NO
合理的做法
设立一个输入缓冲区,用以接受用户输入的一行 字符,然后逐行存入用户数据区,并假设“#”为 退格符,“@”为退行符。
入栈
出栈
用户输入
缓存区
(用栈模拟)
用户数据区
假设从终端接受了这样两行字符: whli##ilr#e(s#*s) outcha@putchar(*s=#++);
相关文档
最新文档