一、栈的概念
栈(stack)又名堆栈,它是一种运算受限的线性表。限定仅在表尾进行插入和删除操作的线性表。这一端被称为栈顶,相对地,把另一端称为栈底。
栈的特点:
1.元素是一前一后、一对一的关系
2.有两端:栈底、栈顶
3.操作受限:插入和删除都只能在栈顶进行
二、利用python建立栈
python并没有内建栈,但是我们可以利用列表实现栈的模拟。
入栈即往列表内添加元素,可以用append()
方法,出站即把列表中的最后一个元素删除并返回相应的值,可以用pop()
方法。
栈的简单应用-中缀表达式转后缀表达式
设一般数学表达式的运算符包括 +、-、*、/ 四种,当然允许(),且()优先级高。为方便实现,设定输入的表达式只允许个位整数。要求设计一个完整的程序,对输入的一个日常的中缀表达式,先转换成后缀表达式,然后计算该后缀表达式的值,输出相关结果信息。
如:
输入中缀表达式:2*(3+4)-(8-3)/5
转换后缀表达式:234+*83-5/-
表达式结果:13
1 | def opcom(ch1,ch2): |
运行结果:
1 | 中缀表达式:((2*(3+4))-((8-3)/5)) |
为方便栈的基本操作,可以建立以下方法:
Stack() 建立一个空的栈对象
push() 把一个元素添加到栈的最顶层
pop() 删除栈最顶层的元素,并返回这个元素
peek() 返回最顶层的元素,并不删除它
isEmpty() 判断栈是否为空
size() 返回栈中元素的个数
汇总成一个栈的类:
1 | class Stack: |
三、队列的概念
队列是一种特殊的线性表,特殊之处在于它只允许在表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作,和栈一样,队列是一种操作受限制的线性表。进行插入操作的端称为队尾,进行删除操作的端称为队头。
队列的特点:
1.元素仍是一前一后、一对一的关系
2.有两端:队头、队尾
3.操作受限:队尾进元素(插入)、队头出元素(删除)。即一头进一头出
队列的应用
【例】银行业务取票排队
【例】医院挂号
【例】机票、火车票等订票
【例】汽车加油站
【例】打印机缓冲区
队列的基本操作运算:
creat() 创建一个空队列
enqueue() 新元素入队列,即参与排队
dequeue() 删除队头元素,即队头元素出队列
isempty() 判断队列是否为空
isfull() 判断队列是否已满
frontval() 查看队头元素,但不出队列
利用python的列表(list)来实现队列,同时设立front和rear两个指示器(int变量)分别指向队头元素的前一个位置和队尾元素的位置(下标)。
建立队列:
1 | q = [] |
空队标志:
1 | front= =rear |
入队:
1 | rear+=1 ` |
出队:
1 | front+=1 |
汇总如下:
1 | MAXSIZE=100 #定义队列的最大容量 |
但是,利用列表会存在溢出问题:
①真溢出,真满
1 | front==-1 |
②假溢出,假满
1 | front != -1 |
解决的方法--循环队列
关键:利用“模”运算
1.入队:
1 | rear=(rear+1)%MAXSIZE; |
2.出队:
1 | front=(front+1)%MAXSIZE; |
3.队列为空条件:
1 | front==rear |
4.队列为满的条件:
1 | (rear+1)%MAXSIZE==front |
5.当前队列元素个数:
1 | (rear-front+MASXIZE)%MAXSIZE |
1 | MAXSIZE=100 #定义队列的最大容量 |
四、队列的链式表示和实现—-链队列
与单链表结构一样,用一带头结点的单链表表示队列,成为链队列。显然,需要两个分别指向对头和队尾的指针,并约定头指针端为队头。
由此,链队列的结构与单链表一样,唯一区别在于操作不同,是单链表插入和删除的特殊情形。
入队:就是在链表表尾插入元素,即rear后面插入一结点
出队:就是删除表头元素
链队列结构(类)的声明
1 | class Qnode: |
1 | def EnQueue(item): |
1 | def DeQueue (): |