目录
栈和队列
栈的概念和实现
栈的概念
栈是一种特殊的线性表,它只允许在其固定的一端进行插入和删除操作,进行数据插入和删除操作的一端称为栈顶,另一端称为栈底。栈中的元素遵循先入后出的规则。
栈的插入也叫入栈、压栈、进栈。是将入栈元素存放在栈顶,栈顶元素变更为新存放的元素。
栈的删除也叫出栈。是将栈顶元素删除。栈顶元素变为删除后的栈顶元素的下一个元素。
栈的基本操作
栈的操作一般常用的为初始化,入栈,出栈,获取栈顶元素,判断栈是否为空,判断栈是否已满。这些操作代码将会在栈的实现中出现。
用链表和顺序表实现栈
栈的实现主要可以靠顺序表或者链表来实现。但是由于是在队尾操作,所以根据顺序表和链表的特性,一般顺序表实现比较简单。
顺序表实现栈
import java.util.Arrays;
public class MyStack {
//顺序表的底层是数组,因此使用数组来存储栈元素;
public int [] elem;
public int top;//用来获取栈的长度,防止数组越界异常。
public MyStack(){
//构造栈
elem = new int [10];
top = 0;
}
public boolean isFull(){
//判满
if(top == elem.length){
return true;
}else{
return false;
}
}
public void push(int val){
//入栈操作
if(isFull()){
//扩容
Arrays.copyOf(elem , elem.length * 2);
}
elem[top] = val;
top++;
}
public int pop() {
//出栈
if(empty()){
return -1;
}
int ret = elem[top - 1];
top--;
return ret;
}
public boolean empty(){
//判空
if(top == 0){
return true;
}else{
return false;
}
}
public int peek(){
//获取栈顶元素
if(empty()){
return -1;
}
return this.elem[this.top - 1];
}
}
链表实现栈
class StackNode{
public int value;//存放的数据
public StackNode next;//指向下一个节点
public StackNode(int val){
//构造函数
value = val;
}
}
public class MyStack {
public StackNode front;
public StackNode rear;
public int usedSize = 0;
public void push(int num){
//入栈
StackNode stackNode = new StackNode(num);
if(front == null){
front = stackNode;
rear = stackNode;
}else{
rear.next = stackNode;
rear = stackNode;
}
usedSize++;
}
public int pop(){
//出栈
if(empty()){
return -1;
}
int ret = rear.value;
if(usedSize == 1){
front = null;
rear =