链栈及栈的应用.ppt
《链栈及栈的应用.ppt》由会员分享,可在线阅读,更多相关《链栈及栈的应用.ppt(26页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、链栈及栈的应用现在学习的是第1页,共26页栈的链接存储结构及实现栈的链接存储结构及实现 链栈:链栈:栈的链接存储结构栈的链接存储结构 特殊线性表特殊线性表特殊线性表特殊线性表栈栈栈栈firsta1a2anai链栈需要加头结点吗?链栈需要加头结点吗?如何改造链表实现栈的链接存储?如何改造链表实现栈的链接存储?将哪一端作为栈顶?将哪一端作为栈顶?将链头作为栈顶,方便操作。将链头作为栈顶,方便操作。链栈不需要附设头结点。链栈不需要附设头结点。现在学习的是第2页,共26页栈的链接存储结构及实现栈的链接存储结构及实现 栈顶栈顶栈底栈底链栈:链栈:栈的链接存储结构栈的链接存储结构 特殊线性表特殊线性表特殊
2、线性表特殊线性表栈栈栈栈topanan-1a1firsta1a2anai两种示意图在内存中对两种示意图在内存中对应同一种状态应同一种状态topa1an-1an栈顶栈顶栈底栈底现在学习的是第3页,共26页3 链栈链栈 栈的链式存储栈的链式存储结构称为结构称为链栈链栈,它是,它是运算受限运算受限的单链的单链表,其插入和删除操作仅限制在表头位置上进行表,其插入和删除操作仅限制在表头位置上进行.由于只能在链表头部进行操作,由于只能在链表头部进行操作,故链表没有必要像故链表没有必要像单链表那样附加头结点。单链表那样附加头结点。栈顶指针栈顶指针就是链表的就是链表的头指针头指针。其类型说明为:其类型说明为:
3、typedef struct StackNode DataType data struct StackNode*next ;StackNode*top;现在学习的是第4页,共26页(1)初始化栈初始化栈 void InitStack(StackNode*top)top=NULL;(2)判断空栈判断空栈 int StackEmpty(StackNode*top)return top=NULL;(3)取栈顶取栈顶 DataType GetTop(StackNode*top)if(StackEmpty(p)error(“stack is empty.”);return topdata;现在学习的是第
4、5页,共26页算法描述:算法描述:void Push(StackNode*top,DataType x)s=(StackNode*)malloc(sizeof(StackNode);s-data=x;s-next=top;top=s;topanan-1a1(4)入栈入栈 xstop操作接口:操作接口:void Push(StackNode*top,DataType x)为为什什么么没没有有判判断断栈栈满满?现在学习的是第6页,共26页算法描述:算法描述:DataType Pop(StackNode*top)if(StackEmpty(top)error(“stack underflow.”);
5、x=top-data;p=top;top=top-next;delete p;return x;(5)出栈出栈操作接口:操作接口:DataType Pop(StackNode*top)topanan-1a1topp top+可以吗?可以吗?现在学习的是第7页,共26页 3.2 栈的应用举例栈的应用举例1 数制转换数制转换 十进制十进制N和其它进制数的转换是计算机和其它进制数的转换是计算机实现计算的基本问题实现计算的基本问题,其解决方法很多其解决方法很多,其其中一个简单算法基于下列原理中一个简单算法基于下列原理:N=(n div d)*d+n mod d (其中其中:div为整除运算为整除运算,
6、mod为求余运算为求余运算)例如例如(1348)10=(2504)8,其运算过程如其运算过程如下:下:现在学习的是第8页,共26页 N N div 8 N mod 8 1348 168 4 168 21 0 21 2 5 2 0 2 先入栈,再出栈 入栈顺序:4,0,5,2.出栈顺序:2,5,0,4 所以 1348=(2504)o现在学习的是第9页,共26页 void conversion()/输入任意一个非负十进制整数输入任意一个非负十进制整数,打印输出与其等值的八进制数打印输出与其等值的八进制数 InitStack(S);/初始化栈初始化栈 scanf(“%d”,N);/输入一个非负十进制
7、数输入一个非负十进制数 while(N)/非零时非零时,循环循环 push(S,N%8);/余数入栈余数入栈 N=N/8;while(!StackEmpty(S)Pop(S,e);/余数出栈余数出栈 printf(“%d”,e);/conversion 现在学习的是第10页,共26页2 行编辑程序行编辑程序 接受用户输入的一行字符,然后逐行存入用户数据接受用户输入的一行字符,然后逐行存入用户数据区。允许用户输入错误,并在发现有误时可以及时更正。区。允许用户输入错误,并在发现有误时可以及时更正。例如例如:用户发现输入错误时用户发现输入错误时,输入输入”#”(退格符退格符),以表示以表示前一个字符
8、无效前一个字符无效;输入输入”(退行符退行符),表示当前输入的表示当前输入的一行无效一行无效;设一个栈接受输入设一个栈接受输入,每输入一个字符每输入一个字符,做如下判断做如下判断:是无效符是无效符,删除前一个入栈的符号删除前一个入栈的符号 是退行符是退行符,删除前一行入栈的符号删除前一行入栈的符号 其它其它,入栈入栈 现在学习的是第11页,共26页行编辑程序算法如下行编辑程序算法如下:void LineEdit()/利用字符栈利用字符栈S,从终端接收一行并传送至数据区从终端接收一行并传送至数据区 InitStack(S);/构造空栈构造空栈 ch=getcher();/从终端接收第一个字符从终
9、端接收第一个字符 while(ch!=EOF)/EOF为全文结束符为全文结束符 while(ch!=EOF&ch!=n)switch(ch)case#:Pop(S,c);/无效符无效符,出栈出栈 case :ClearStack(S);/退行符退行符,清空栈清空栈 default:Push(S,ch);/其它其它,入栈入栈 现在学习的是第12页,共26页 ch=getchar();/从终端接收下一个字符从终端接收下一个字符 /while /将从栈底到栈顶的栈内字符传送至调用过程的数据将从栈底到栈顶的栈内字符传送至调用过程的数据区区ClearStack(S);if(ch!=EOF)ch=getc
10、har();DestroyStack(S);/LindeEdit现在学习的是第13页,共26页表达式的计算表达式的计算在计算机中进行算术表达式的计算是通过栈来实现的。在计算机中进行算术表达式的计算是通过栈来实现的。(1)算术表达式的三种表示:算术表达式的三种表示:中缀:中缀:双目运算符出现在两个操作数中间双目运算符出现在两个操作数中间,例:例:a+b前缀:前缀:双目运算符出现在两个操作数前面双目运算符出现在两个操作数前面,例:例:+ab后缀:后缀:双目运算符出现在两个操作数后面双目运算符出现在两个操作数后面,例:例:ab+(2)三种表达式之间的转换:三种表达式之间的转换:按运算的优先次序全部加
11、上括号,逐个括号写成另一种表示按运算的优先次序全部加上括号,逐个括号写成另一种表示式式 (括号括号*,/+,-)注意:操作数出现的顺序不变注意:操作数出现的顺序不变3 表达式求值表达式求值现在学习的是第14页,共26页 三种表达式之间的转换:三种表达式之间的转换:例例 将将中缀表达式中缀表达式:转换成转换成后缀表达式后缀表达式 (A+B)*D E/(F+A*D)+CAB+F AD*+AB+D*E FAD*+/AB+D*EFAD*+/-AB+D*EFAD*+/-C+例:例:A+B*D E/F+A*D+CABD*+EF/-AD*+C+现在学习的是第15页,共26页 把表达式翻译成正确的机器执行指令
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 应用
限制150内