1.简介
栈是一种只能在一端进行插入(入栈)或删除(出栈)的线性表,表中运行进行插入,删除的一端为栈顶,另一端为栈底。
栈的特点是先进后出 ,每次后进栈的元素先出栈,每次进栈的数据元素都放在栈顶充当新的栈顶元素,栈也被称为后进先出表。栈也分为顺序栈和链栈。
2.顺序栈
2.1简介
顺序栈主要是采用顺序存储结构来存储数据,和线性表一样,线性表也分为顺序表和链表,而栈也有顺序栈,通常使用数组来实现。
2.2 相关操作
如上所示,我们可以使用一个指针(变量)top == -1来判断栈空,当我们把元素进栈时,让top加1往上移,然后将元素放进去,如果元素想要出栈的话,将top里的值取出来,然后让top减1。
在顺序栈里,通常使用top==-1来表示栈底或栈空,使用top==(数组大小)-1来代表栈满了,顺序栈可以使用数组的方式来实现。
2.3 代码实现
package Structures;
import java.util.Scanner;
public class ArrayStack {
public static void main(String[] args) {
Stack stack = new Stack(4);
String key;
boolean loop = true;
Scanner scanner = new Scanner(System.in);
while (loop){
System.out.println("show: 遍历栈");
System.out.println("exit: 退出栈");
System.out.println("push: 入栈");
System.out.println("pop: 出栈");
System.out.println("请选择相关操作");
while (loop){
key = scanner.next();
switch (key){
case "show":
stack.list();
break;
case "exit":
scanner.close();
loop = false;
break;
case "push":
System.out.println("请输入值:");
int i = scanner.nextInt();
stack.push(i);
break;
case "pop":
try{
int pop = stack.pop();
System.out.print(pop);
}catch (Exception e){
System.out.println(e.getMessage());
}
break;
}
}
}
}
}
class Stack {
private int maxSize;
private int[] stack;
private int top = -1;
public Stack(int maxSize) {
this.maxSize = maxSize;
stack = new int[maxSize];
}
//判断栈空
public boolean isFull() {
return top == maxSize - 1;
}
//判断栈满
public boolean isEmpty() {
return top == -1;
}
//入栈
public void push(int value) {
if (isFull()) {
System.out.println("栈已满");
}
top++;
stack[top] = value;
}
//出栈
public int pop() {
if (isEmpty()) {
throw new RuntimeException("栈空,无数据");
}
int value = stack[top];
top--;
return value;
}
//遍历栈
public void list() {
if (isEmpty()) {
System.out.println("栈空,无数据");
return;
}
for (int i = top; i >=0 ; i--) {
System.out.println(stack[i]);
}
}
}