栈
栈的定义: 栈(Stack)是限制仅在表的一端进行插入和删除运算的线性表。
通常称插入、删除的这一端为栈顶(Top),另一端称为栈底(Bottom)。
当表中没有元素时称为空栈。
栈为后进先出(Last In First Out)的线性表,简称为LIFO表。
java代码实现:
public class MyStack {
//栈的底层使用数组来存储数据
int[] elements;
public MyStack() {
elements=new int [0];
}
//压入元素
public void push(int element) {
//创建一个新数组
int [] newArr=new int[elements.length+1];
//把原来数组的元复制到新数组中
for(int i=0;i<elements.length;i++) {
newArr[i]=elements[i];
}
//把添加的元素放到新数组中
newArr[elements.length]=element;
//使新数组替换旧数组
elements=newArr;
}
//取出栈顶元素
public int pop() {
if(elements.length==0) {
throw new RuntimeException("stack is null");
}
//取出数组的最后一个元素
int element=elements[elements.length-1];
//创建一个新数组
int[] newArr=new int [elements.length-1];
//原数组中除了最后一个的其他元素都放入新的数组中
for(int i=0;i<elements.length-1;i++) {
newArr[i]=elements[i];
}
//替换数组
elements=newArr;
//返回栈顶元素
return element;
}
//查看栈顶元素
public int peek() {
//栈中没有元素
if(elements.length==0) {
throw new RuntimeException("stack is null");
}
return elements[elements.length-1];
}
//判断栈是否为空
public boolean isEmpty() {
return elements.length==0;
}
}
public class testMyStack {
public static void main(String[] args) {
//创建一个栈
MyStack ms=new MyStack();
//压入数组
ms.push(9);
ms.push(8);
ms.push(7);
//取出栈顶元素
System.out.println(ms.pop());
System.out.println(ms.pop());
System.out.println(ms.pop());
//System.out.println(ms.peek());
System.out.println(ms.isEmpty());
}
队列
定义:队列(Queue)是只允许在一端进行插入,而在另一端进行删除的运算受限的线性表
队列亦称作先进先出(First In First Out)的线性表,简称为FIFO表。
java代码实现:
public class MyQueue {
int elements[];
public MyQueue() {
elements=new int[0];
}
//入队
public void add(int element) {
//创建一个新数组
int [] newArr=new int[elements.length+1];
//把原来数组的元复制到新数组中
for(int i=0;i<elements.length;i++) {
newArr[i]=elements[i];
}
//把添加的元素放到新数组中
newArr[elements.length]=element;
//使新数组替换旧数组
elements=newArr;
}
//出队
public int poll() {
//把数组中的第0个元素取出来
int element=elements[0];
//创建一个新的数组
int[] newArr=new int[elements.length-1];
//复制原有元素到数组中
for(int i=0;i<newArr.length;i++) {
newArr[i]=elements[i+1];
}
//替换数组
elements=newArr;
return element;
}
//判断队列是否为空
public boolean isEmpty() {
return elements.length==0;
}
}
public class TestMyQueue {
public static void main(String[]args) {
//创建一个队列
MyQueue mq=new MyQueue();
//入队
mq.add(9);
mq.add(8);
mq.add(7);
//出队
System.out.println(mq.poll());
System.out.println(mq.poll());
System.out.println(mq.poll());
System.out.println(mq.isEmpty());
}
}
栈与队列的异同点
相同点:
都是线性结构,元素之间具有“一对一”的逻辑关系
插入操作都是再表尾进行
都可以使用顺序存储结构或链式存储结构实现
在时间代价上,插入删除操作的时间复杂度都是O(1), 在空间待见上也相同。
不同点
删除操作的位置不同,栈只在表尾操作,队列在表头操作;
栈是后进先出(LIFO),队列是先进先出(FIFO),
应用场景不同,顺序栈可以多栈空间共享,而顺序队列不同