- 栈的基本操作:入栈、出栈、取栈顶元素------后进先出
一、用顺序表来实现栈的基本操作
实现思路:针对顺序表的尾插(入栈)、尾删(出栈)、根据下标获取元素的操作(取栈顶元素)
该思路的时间复杂度为O(1)
不用头插头删的原因是:效率低,每次头插头删都会把后面所有元素都搬运一遍,时间复杂度为O(N)
//用顺序表来实现栈的基本操作---后进先出
public class MyStack {
//创建一个顺序表,提前开辟空间
private int[]arr=new int[100];
//记录当前顺序表有效长度
private int size=0;
//1.入栈(尾插)
public void push(int val){
//先考虑特殊情况(顺序表满)
if(size>=arr.length-1){
return;
}
arr[size]=val;
size++;
}
//2.出栈(尾删)
public Integer pop(){
//先考虑特殊情况
// 栈为空
if(size==0){
return null;
}
int ret=arr[size-1];
size--;
return ret;
}
//3.取栈顶元素
public Integer peek(){
//先考虑特殊情况
// 栈为空
if(size==0){
return null;
}
int ret=arr[size-1];
return ret;
}
二、用链表来实现栈的基本操作
实现思路:针对链表的头插(入栈)、头删(出栈)、取链表表头元素(取栈顶元素)
该思路的时间复杂度为O(1)
不使用尾插尾插的原因是:虽然也可以高效完成,但是需要额外记录信息,稍微复杂一点
class Node{
int val;
Node next;
public Node(int val) {
this.val = val;
}
}
//用(不带傀儡结点的)链表来实现栈的基本操作---后进先出
public class MyStack2 {
private Node head=null;
//入栈(头插)
public void push(int val){
Node newNode=new Node(val);
//栈空
if(head==null){
head=newNode;
return;
}
newNode.next=head;
head=newNode;
}
//出栈(头删)
public Integer pop(){
//栈空
if(head==null){
return null;
}
//栈中只有一个元素
if(head.next==null){
int ret=head.val;
head=null;
return ret;
}
//一般情况
int ret=head.val;
head=head.next;
return ret;
}
//取栈顶元素
public Integer peek(){
//栈空
if(head==null){
return null;
}
return head.val;
}
public static void main(String[] args) {
MyStack2 myStack2=new MyStack2();
myStack2.push(1);
myStack2.push(2);
myStack2.push(3);
myStack2.push(4);
System.out.println(myStack2.pop());
System.out.println(myStack2.pop());
System.out.println(myStack2.pop());
System.out.println(myStack2.pop());
}
}