栈
概念
一种特殊的线性表,其只允许在固定的一端进行插入和删除元素操作。进行数据插入和删除操作的一端称为栈顶,另一端称为栈底。栈中的数据元素遵守后进先出LIFO(Last In First Out)的原则。
- 压栈: 栈的插入操作叫做进栈/压栈/入栈,入数据在栈顶。
- 入栈:栈的删除操作叫做出栈。出数据在栈顶。
首先栈中的数据元素准循着先进后出(后进先出)的原则!!!
举个例子:
就和我们现实生活中用口袋装东西一样,往里面放东西,往往先放的物品会在最下面,最后放的东西会在最上面,那么取东西时,也是一样最后放的东西在最上面,也就最先取出来:
当物品3进来的时候会把物品1 和物品2 压在下面 ,所以我们也叫压栈
出栈时,最上面的物品也会最先被拿出去, 这样才能取到下面的东西
实现栈
1.利用顺序表实现,即使用尾插 + 尾删的方式实现
2. 利用链表实现,则头尾皆可
相对来说,顺序表的实现上要更为简单一些,所以我们优先用顺序表实现栈。
public class MyStack {
public int [] elem;
public int size;
public MyStack(){
this.elem = new int [10];
this.size = 0;
}
public boolean isFull(){
return this.size == this.elem.length;
}
public void push(int val){
if (isFull()){
System.out.println("自动扩容");
this.elem = Arrays.copyOf(this.elem,this.elem.length*2);
return;
}
this.elem[this.size] = val;
this.size++;
}
public int pop() throws UnsupportedOperationException{
if (empty()){
throw new UnsupportedOperationException("栈为空");
}
int old = this.elem[this.size-1];
this.size--;
return old;
}
public int peek() throws UnsupportedOperationException{
if (empty()){
throw new UnsupportedOperationException("栈为空");
}
return this.elem[this.size-1];
}
public boolean empty(){
return this.size ==0;
}
}
队列
概念
队列:只允许在一端进行插入数据操作,在另一端进行删除数据操作的特殊线性表,队列具有先进先出FIFO(First In First Out);
在具体应用中通常用链表或者数组来实现。队列只允许在后端(称为rear)进行插入操作,在前端(称为front)进行删除操作。
举个例子:
队列就像一个水管一样,从一头进水,从另一头出水
实现
队列也可以数组和链表的结构实现,使用链表的结构实现更优一些,因为如果使用数组的结构,出队列在数组头上出数据,效率会比较低。
队列的基本操作:
-
判断队列是否为空:IsEmpty
操作前提:队列已经存在。
操作结果:若队列不为空返回false,否则返回true。 -
入队操作:offer(int val)
操作前提:队列已经存在。
操作结果:在队列的队尾插入val。 -
出队操作: poll()
操作前提:队列已经存在且非空。
操作结果:将队列的队头元素出队。 -
取队首元素: peek()
操作前提:队列已经存在且非空。
操作结果:若队列不为空返回队头元素,否则抛出异常
class Node{
public Node next;
public int val;
public Node(int val) {
this.val = val;
}
}
public class MyQueue {
public Node head;//头
public Node tail;//尾
public int size;
//入队
public void offer(int val){
Node node = new Node(val);
if(this.head == null){
this.head = node;
this.tail = node;
}else {
this.tail.next = node;
this.tail = node;
}
this.size++;
}
//出队
public int poll() throws UnsupportedOperationException{
if (isEmpty()){
throw new UnsupportedOperationException("队列为空!");
}
int old = this.head.val;
this.head = this.head.next;
this.size--;
return old;
}
//获取对头元素,但是不删除
public int peek() throws UnsupportedOperationException{
if (isEmpty()){
throw new UnsupportedOperationException("队列为空!");
}
return this.head.val;
}
//判断为空
public boolean isEmpty(){
return this.size ==0;
}
public int size(){
return this.size;
}
}
一些常见的练习题