深度解析:数据结构与算法中的栈
发表时间: 2019-08-13 18:50
百度百科上,栈是这么定义的:
稍微介绍一下关键名词:
栈的应用:
这里我们介绍数组实现的栈和链表实现的栈。
数组实现
结构设计
private T data[];private int top;public seqStack() {data=(T[]) new Object[10];top=-1;}public seqStack(int maxsize){data=(T[]) new Object[maxsize];top=-1;}
push插入
栈的核心操作之一push:入栈操作。
pop弹出并返回首位
其他操作
链表实现
有数组实现,链表当然也能实现。对于栈的运算。大致可以分为两种思路:
结构设计
长话短说,短话不说。直接上代码就懂。
链表的节点:
static class node<T>{T data;node next;public node() {}public node(T value){this.data=value;}}
基本结构:
public class lisStack <T>{int length;node<T> head;//头节点public lisStack() {head=new node<>();length=0;}//其他方法}
push插入
与单链表头插入一致,如果不太了解请先看笔者队线性表介绍的。
和数组形成的栈有个区别。就是理论上栈没有大小限制(不突破内存系统限制)。不需要考虑是否越界。
pop弹出
与单链表头删除一致,如果不太了解请先看笔者队线性表介绍的。
和数组同样需要判断是否为空。
其他操作
数组实现
package 队栈;public class seqStack<T> { private T data[]; private int top; public seqStack() { data=(T[]) new Object[10]; top=-1; } public seqStack(int maxsize) { data=(T[]) new Object[maxsize]; top=-1; } boolean isEmpty() { return top==-1; } int length() { return top+1; } boolean push(T value) throws Exception//压入栈 { if(top+1>data.length-1) { throw new Exception("栈已满"); } else { data[++top]=value; return true; } } T peek() throws Exception//返回栈顶元素不移除 { if(!isEmpty()) { return data[top]; } else { throw new Exception("栈为空"); } } T pop() throws Exception { if(isEmpty()) { throw new Exception("栈为空"); } else { return data[top--]; } } public String toString() { if(top==-1) { return ""; } else { String va=""; for(int i=top;i>=0;i--) { va+=data[i]+" "; } return va; } }}
链表实现
package 队栈;public class lisStack <T>{ static class node<T> { T data; node next; public node() { } public node(T value) { this.data=value; } } int length; node<T> head;//头节点 public lisStack() { head=new node<>(); length=0; } boolean isEmpty() { return head.next==null; } int length() { return length; } public void push(T value) {//近栈 node<T> team=new node<T>(value); if(length==0) { head.next=team; } else { team.next=head.next; head.next=team;} length++; } public T peek() throws Exception { if(length==0) {throw new Exception("链表为空");} else {//删除 return (T) head.next.data; } } public T pop() throws Exception {//出栈 if(length==0) {throw new Exception("链表为空");} else {//删除 T value=(T) head.next.data; head.next=head.next.next;//va.next length--; return value; } } public String toString(){ if(length==0) {return "";} else { String va=""; node team=head.next; while(team!=null) { va+=team.data+" "; team=team.next; } return va; } }}
测试