zoukankan      html  css  js  c++  java
  • 线性表和堆栈的笔记

    1.堆栈:
        1.1 引子    
            一种数据结构,在函数调用,表达式求值等都有广泛的应用
            中缀表达式:a+b*c-d/e:生活中经常使用,但是计算机不好识别
            后缀表达式:abc*+dc/-:生活中不好使用,但计算机容易识别

            例:求后缀表达式的值
                6 2 / 3 - 4 2 * + =

                后缀表达式的求解原理:遇到数值先记录,遇到符号才计算。计算离符号最近的两个数
                1.6 2 / ==> 3
                2.3 3 - ==> 0
                3.0 4 2 * ==> 0 8
                4.0 8 + ==>8
                5.8 = ==> 8
            总结:因此需要一种存储方法,能顺序的存储运算数,在需要时倒叙输出。-->堆栈有
            堆栈的特点:后入先出。

        1.2堆栈的操作
        操作集:长度为maxSize的堆栈S ==> stack,堆栈的元素elementType,那么如下的操作
            stack createStack(int maxSize);//生成空堆栈,其最大长度为maxSize
            int isFull(stack s,int maxSize);//判断栈s是否为空
            void push(stack  s,elementType item);//将元素压入堆栈
            int isEmpty(stack s);//判断堆栈是否为空
            elementType pop(stack s);//删除并返回栈顶元素
            
            1.2.1
                用数组来表示堆栈的方法可以参照文件夹下面的同级目录的文件stackArray.c
                同时还有使用一个数组来表示两个堆栈,twoStack.c
            
            1.2.2使用链表来模拟堆栈
                因为链表有两头,但是堆栈的头指针我们会选择链表的头节点,因为便于删除操作,尾节点不方便进行删除操作
                下面是模拟的示意图
                    head(头指针,没有元素的) --> node1(top指针) --> node2(堆栈中的元素) --> node3 --> node4
                代码可以见:stackLinkList.c

            1.2.3 利用堆栈进行表达式求值
                我们平时所见到的表达式都是中缀表达式,但是如果想求表达式的值,先把中缀表达着中文后缀表达式,
                在利用堆栈对后缀表达式进行求值

                中缀表达式转后缀表达式的思路;
                    首先看一个简单的:
                    中缀表达式:2 + 9 / 3 - 5    后缀表达式:2 9 3 / + 5 -

                    通过对比我们发现,中缀表达式和后缀表达式的数字顺序并没有发生改变,只是符号位置发生了改变
                    所以,我们可以构思,使用一个栈来存在运算符,遇到数字就输出,遇到符号就压栈,如果读入的符号比栈顶的符号
                    优先级高,就压栈,否则就弹栈并输出
                    下面是中缀表达式:2 + 9 / 3 - 5压栈和弹栈的具体步骤
                    输出        堆栈内元素
                    2           
                               +
                    9           
                               /(优先级比+高,压栈)
                    3           
                    / +           -(首先弹出/,但是因为同级运行需要按照从左往右的运算,所以+也需要弹栈)
                    5           -
                    -          (元素全部读取完毕以后,-弹栈)

                    所以中缀表达式:2 + 9 / 3 - 5的后缀表达式为 2 9 3 / + 5 -

                    但是如果遇到带有()的表达式怎么办:遇到"("把"("压入栈中,此时栈中的"("运算级别最低,在按照上面的运算符的运算规则来
                    进行压栈和弹栈。直到读取到")",才把"("弹栈,但是对"("和")"不进行输出

                    举个例子:
                    求下面中缀表达式:2 * (9+6/3-5)+4的后缀表达式

                    输出            堆栈内元素(top->bottom)

                    2
                                     *
                                     ( *
                    9                 + ( *
                    6            
                                     / + ( *
                    3                 
                                     - ( *(首先弹出/,但是因为同级运行需要按照从左往右的运算,所以+也需要弹栈,并输出)
                        / +
                    5
                    -                *(遇到")",把栈里依次弹出,直到遇到第一个"(",但是对"("和")"不进行输出)
                    *                +(遇到+,先弹出*,然后输出)
                    4                +
                    +                NULL(没有元素可读,弹出堆栈中最后一个元素)
                    
                    所以中缀表达式:2 * (9+6/3-5)+4的后缀表达式为: 2 9 6 3 / + 5 - * 4 +


                                    

                    




           

  • 相关阅读:
    Programming Windows 第五版读书笔记 第三章 窗口和消息
    一个带游标的遍历数据的函数|数据库操作|软件开发
    递归删除一个文件夹下的所有文件c#代码
    杭州市市民卡办理点
    NTLDR is missing 的解决方法
    SQL Server中 将日期格式化.函数 CONVERT
    1.显示网页中的所有图片
    用sql函数获取中文字符串的全拼
    地柜便利一个文件夹下的所有文件|软件开发
    软件是什么
  • 原文地址:https://www.cnblogs.com/yghjava/p/6618474.html
Copyright © 2011-2022 走看看