目录
前言
一、栈
1.何为栈
定义
栈(stack)又名堆栈,它是一种运算受限的线性表。限定仅在表尾进行插入和删除操作的线性表。
入栈(push):栈的插入操作,插入的数据在栈的顶部。
出栈(pop):栈的删除操作,删除的数据在栈的顶部。
由此可见,栈的第一大特点便是数据遵循先进后出的原则。
2.栈的模拟实现
使用数组和链表都可以模拟实现栈
本篇使用数组。
RT:
public class Mystack {
public int[] elem;
public int usedsize;//标记当前元素个数
public int DEFAULT_SIZE = 10;//默认容量
public Mystack() {
this.elem = new int[DEFAULT_SIZE];
}
}
push(int val)
入栈
和顺序表类似,我们需要考虑当前栈是否满。如果满了,意味着入栈失败,我们直接return,也可以在此处抛异常,如果没满,我们只要在数值末尾插入即可。
因此我们需要先写一个判满函数:
public boolean isFull(){
return this.usedsize == DEFAULT_SIZE;
}
RT:
public void push(int val){
if(isFull()){
return;
}
this.elem[usedsize++] = val;
}
pop()
出栈
同样,考虑到出栈,也有可能会存在栈为空的情况,因此我们先需要判空。不为空直接返回数组的最后一个元素。
RT:
public boolean isEmpty(){
return this.usedsize==0;
}
public int pop(){
if(isEmpty()){
System.out.println("kong");
//最好抛异常
return -1;
}
return this.elem[--usedsize];
}
peek()
返回栈顶元素(不删除)
public int peek(){
if(isEmpty()){
System.out.println("kong");
//抛异常
return -1;
}
return this.elem[usedsize-1];