线性表和堆栈的笔记

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 +


                                

                




       

posted @ 2017-03-25 21:03  浪漫逆风  阅读(277)  评论(0编辑  收藏  举报