栈、队列,都是线性结构
一、栈
1-1、栈的定义
只能通过访问他的一端来实现数据的存储和检索的线性结构。
特点:先进后出
不含数据元素的栈——空栈。
栈的典型应用,递归。
1-2、栈的存储结构
1-2-1、栈的顺序存储——顺序栈
可以用数组实现。
(用地址连续的存储单元存放栈中的元素)
int[] arr = new int[10];
要预先定义栈的存储空间,即,栈空间的容量是有限的,所以,入栈的时候,要判断是否栈满。
1-2-2、栈的链式存储——链栈
头指针 = 栈顶指针
StackNode{
int data;
StackNode next;
}
链栈的基本操作:
①初始化
top = null;
②判空
if(top == null){
return true;
}else{
return false;
}
③入栈
node.next = top;
top = node;
④出栈
if(isEmpty()){
return false;
}
top = top.next;
⑤读栈顶元素
if(isEmpty()){
return false;
}
return top;
1-3、栈的真题
真题1:
真题2:
真题3:
真题4:
真题5:
真题6:
真题7:
真题8:
二、队列
2-1、队列的定义
允许在表的一端插入元素,表的另一端删除元素的线性表
特点:先进先出
2-2、队列的存储结构
2-2-1、队列的顺序存储——顺序队列
用数组实现。
用地址连续的存储单元存放栈中的元素。
1、顺序队列的基本操作:
①初始化
注意:
此时,队头、队尾指针,指向相同的位置!!!
②判空
if(front == rear){
return true;
}else{
return false;
}
③入队
q[rear] = x;
rear++;
注意:
入队的时候,队尾指针要向后移,指向下一个元素的位置;队头指针不动。
④出队
// 判空
if(isEmpty()){
return false;
}
front++;
注意:
出队的时候,队头指针向后移。
⑤读队头元素
if(isEmpty()){
return false;
}
return q[front];
2、循环队列
此方式,队列存在一个问题,看似满了,实则没有满。
解决方式:循环队列。
此时,判空有问题:
2-2-2、队列的链式存储——链队列
为了便于操作,给链队列添加一个头节点。
判空:头指针 = 尾指针,且均指向头结点。
1、链队列的基本操作
④出队
特殊情况,当链队列中只有一个节点的时候,删除队尾节点,tail队尾指针需要重新定位到队头指针的位置。
注意:
链队列的入队、出队,不用遍历整个链表。
2-2-3、双端队列
2-3、队列的真题
真题1:
真题2:D
真题3:
真题4:
真题5:
真题6:
真题7:
真题8:
三、栈、队列真题
真题1:
利用两个栈可以模拟一个队列!!!
真题2:
出队列的序列只有一种。 入队和出队序列是一样的。
真题3:
真题4:
真题5:
真题6: