目录
1、总体概述
栈、队列也是线性结构,但是它们与线性表不同,区别在于:它们 限制存取位置。
2、栈
最主要特点:后进先出(LIFO)
栈的数组表示——顺序栈
栈的链接表示——链式栈
关键其实就是实现top(), pop(), top(), empty()等操作。
合法出栈序列种数:
栈的应用:表达式的计算
算术表达式有三种表示:
中缀(infix)表示 <操作数> <操作符> <操作数>,如 A+B;
前缀(prefix)表示 <操作符> <操作数> <操作数>,如 +AB;
后缀(postfix)表示 <操作数> <操作数> <操作符>,如 AB+;
笔试需要学会三种表达式的相互转换:尤其是中缀转后缀
中缀转后缀:
先对中缀表达式按运算优先次序加上括号,再把操作符后移到右括号的后面并以就近移动为原则,最后将所有括号消去。
应用后缀表示计算表达式的值:
从左向右顺序地扫描表达式,并用一个栈暂存扫描到的操作数或计算结果。
扫描中遇操作数则压栈;遇操作符则从栈中退出两个操作数,计算后将结果压入栈。
最后计算结果在栈顶。
3、队列
定义:
队列是只允许在一端删除,在另一端插入的顺序表。允许删除的一端叫做队头(front),允许插入的一端叫做队尾(rear)。
特性:先进先出(FIFO)
队列的数组存储表示 —— 顺序队列
非循环队列:
注意 rear 和 front 的位置
空队列:front==rear;
队满时:rear==maxSize - 1; (假溢出)
进队:新元素在rear处,rear++;
出队:取下标为front的元素,front++;
循环队列:
解决假溢出的办法之一:将队列元素存放数组首尾相接,形成循环(环形)队列
队头、队尾指针加1时从maxSize-1直接进到0,可用语言的取模(余数)运算实现。
队头指针进1: front = (front+1) % maxSize;
队尾指针进1: rear = (rear+1) % maxSize;
队列初始化:front = rear = 0;
队空条件:front == rear;
队满条件:(rear+1) % maxSize == front;
队满实际是空了一格的:
队列的链接表示 —— 链式队列
注意rear指向的位置,与前面的顺序队列区分。
4、优先级队列
优先级队列: 是不同于先进先出队列的另一种队列。每次从队列中取出的是具有最高优先权的元素。优先权是根据问题而定的,出现相同的优先级的元素时,按FIFO的方式处理。