- 1、本文档共118页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
用c语言的数组来实现顺序栈。如果是那样,由于c语言的数组下标规定是从0开始的,那么最初应该把Ss_top设置程成-1,变化范围从0到Ss_max-1。 每一个顺序栈在运作过程中,其栈顶位置是变化的,栈底是不变的。基于这种特点,在程序设计中,可以让两个顺序栈“共享”一个连续的存储区,互补存储空间的不足,以达到减少发生“上溢”出错、节约存储空间的目的。 下图中,只有当Ss_top1和Ss_top2都指向区域中同一个位置时,才会发生上溢”出错 采用这样的技术组织顺序栈时,有两点要注意,一是两个顺序栈中数据元素的类型和尺寸大小应该完全一样:二是一个元素打算进入顺序栈Ss1或进入顺序栈Ss2,对指针进入顺序栈Ss1_top1和Ss2_top2做的操作是不一样的,即对顺序栈Ss1的Ss1_top1应该做“++”操作(朝大方向变化),对顺序栈Ss2的Ss2_top1应该做“--”操作(朝小方向变化)。 由于是出栈操作,因此必须要注意的边界问题是栈是否为空。算法中是通过检查条件: Ss_top == 0是否成立来判断的。 如果在顺序栈空时仍打算出栈,就称为发生了“下溢(Underflow)”出错。 注意,操作“i = Ss_top ”是非常必要的,我们不能把它去掉。因为若把算法变为: Display_Ss(Ss, Ss_top) { for (Ss_top ; Ss_top =0; Ss_top --) printf (%d, Ss[Ss_top]); } 那么算法执行完毕后, Ss_top就指向顺序栈的栈底了,再用它就找不到原先的栈顶元素了。 为了确保Ss_top总是指向栈顶元素,又能够把栈中所有的元素都显示出来,就必须用另一个变量(这里就是i)来代替Ss_top进行变化。 链栈是进栈和出栈操作都被限制在表首进行的单链表,因此与单链表不同,链栈不需要设表头结点,而是在创建时只要将Ls_top设置为NULL. 由于顺序栈事先确定了所占用存储区的大小,所以对它的进栈操作要注意上溢发生的可能性.但对于链栈而言,是动态申请存储结点,然后进行插入,所以根本不用考虑发生上溢的问题,这时链栈的一大优点. 创建一个顺序队列Qs,算法名为Create_Qs(),参数为Qs、Qs_front、Qs_rear、Qs_max。 只有在顺序队列里有数据元素的情况下,才能够做出队操作.判断一个顺序队列是否为空的条件是: Qs_front == Qs_rear.其含义就是队列的首指针和队列的尾指针指向存储区里的同一个位置时,队列没有元素了. 要注意的是,获取顺序队列队首元素,不是要将队首元素出队,因此不能对队首指针Qs_front进行修改,所以本算法只是通过Qs_front+1求得队首元素所在的队位,然后做: x = Qs[Qs_front+1] ;绝对不可以认为必须先将Qs_front++ ;那样一来,就等于将队列的首元素出对了. 怎样区分这两者之间的差别呢?在入队时少用一个数据元素空间,以队尾指针加1等于队首指针判断队满,即队满条件为: (Cq-rear+1) % Cq_max ==Cq-front 队空条件仍为: Cq-rear==Cq-front 已知循环队列Cq,依照队尾指针Qs_rear的指示,往队尾插入一个值为x的新元素。算法名为Insert_Cq(),参数为Cq、Cq_rear、Cq_front、Cq_max、x。 在链式队列的出队操作中,还有一个需要注意的地方,那就是如果原先队列里只有一个元素,即算法里考虑的条件: ptr-Next == NULL成立,那么把整个元素删除后,还必须调整Lq_rear,让它指向队列所设的头结点,否则它就无所指向而”悬空”了,调整的办法就是: Lq_rear = Lq_front 书上例:P75页 后缀表达式的特点是没有括号,没有运算符的优先级,其计算完全按照运算符出现的先后次序进行.因此,在语言编译系统里,整正解决算术表达式求值.总是先把中缀表达式转换为后缀表达式,然后对后缀表达式进行一遍扫描,求得其结果. 3-5*2转换后为352*- (3-5)*2转后后为35-2* 3/(5*2+1)转换后为352*1+/ 注意,我门在这里没有涉及圆括号.圆括号是一个比较特殊的运算符,它出现时,能改变运算顺序,所以它的优先级是最高的.但是它进栈后,为了不阻止括号内的运算符进入op栈,就必须把它的优先级降低到只比”#”高.这又这样,才能够正确处理表达式的计算. (5)遇到左圆括号符“(”时,进入op栈。 (6)遇到右圆括号符“)”时,不进op栈,而是不断地弹出op里的运算符、弹出num里的两个操作数、做运算、结果进num栈,直至遇到左圆括号,让它出op栈,继续进行后面的处理。
您可能关注的文档
- C++ Primer中文版(第4版)(一本久负盛名C++经典教程).pdf
- 第三节调节系统检修工艺.pdf
- C语言基础 第10节.ppt
- EDA实验一 单级放大电路的设计及仿真.doc
- ch08 继承及多态.ppt
- JIS B 0143-1985 螺钉各部尺寸和符号.pdf
- 用于复合服务白盒加密算法.pdf
- 会话分析理论对中国戏剧研究启示_礼貌原则映射下_雷雨_戏剧冲突.pdf
- 第三节进程调度.doc
- 第五节 高级数据访问.ppt
- 数据仓库:Redshift:Redshift与BI工具集成.docx
- 数据仓库:Redshift:数据仓库原理与设计.docx
- 数据仓库:Snowflake:数据仓库成本控制与Snowflake定价策略.docx
- 大数据基础:大数据概述:大数据处理框架MapReduce.docx
- 实时计算:GoogleDataflow服务架构解析.docx
- 分布式存储系统:HDFS与MapReduce集成教程.docx
- 实时计算:Azure Stream Analytics:数据流窗口与聚合操作.docx
- 实时计算:Kafka Streams:Kafka Streams架构与原理.docx
- 实时计算:Kafka Streams:Kafka Streams连接器开发与使用.docx
- 数据仓库:BigQuery:BigQuery数据分区与索引优化.docx
文档评论(0)