1 用数组模拟栈结构
package com.atguigu.stack;
//用数组模拟栈
import java.util.Scanner;
public class ArrayStackDemo {
public static void main(String[] args) {
//测试一下ArrayStack是否正确
ArrayStack stack = new ArrayStack(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("请输入你的选择");
key = scanner.next();
switch (key){
case "show":
stack.list();
break;
case "exit":
scanner.close();
loop=false;
break;
case "push":
System.out.println("请输入一个数");
int value=scanner.nextInt();
stack.push(value);
break;
case "pop":
try {
int res=stack.pop();
System.out.printf("出栈的数据是%d\n",res);
} catch (Exception e) {
System.out.println(e.getMessage());
}
break;
default:
break;
}
}
System.out.println("程序退出");
}
}
class ArrayStack {
private int maxSize;
private int[] stack;
private int top = -1;
//构造器
public ArrayStack(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("栈满"); return;
}
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.printf("stack[%d]=%d\n",i,stack[i]);
}
}
}
2 用链表模拟栈结构
package com.atguigu.stack;
//用链表模拟栈这一数据结构
public class SingleLinkedListStackDemo { //测试类
public static void main(String[] args) {
Stack2 stack2 = new Stack2();
stack2.push(1);
stack2.push(2);
stack2.push(3);
stack2.push(4);
stack2.list();
System.out.println("出栈:");
System.out.println(stack2.pop());
System.out.println(stack2.pop());
System.out.println(stack2.pop());
System.out.println(stack2.pop());
}
}
class Stack2{ //定义一个链表栈
//定义一个头节点
Node head=new Node(0);
//临时变量保存头节点
Node temp=head;
//栈空
public boolean isEmpty(){
return head.next==null;
}
//入栈
public void push(int value){
Node node=new Node(value);
temp.next=node;
temp=temp.next;
}
//出栈
public int pop(){
if(isEmpty()){
System.out.println("栈为空");
return -1;
}
Node pre=head;
while (true){
if(pre.next==temp){
break;
}
pre=pre.next;
} //退出循环后temp在栈顶,pre在栈顶的前一个节点处
int value=temp.value; //将栈顶的值取出
pre.next=temp.next; //跳过temp这个节点,下一次pop就没有了栈顶这个节点
temp=pre; //将pre的位置定义为现在的栈顶
return value;
}
//遍历栈
public void list() {
temp=head;
if(isEmpty()){
System.out.println("栈空");
return;
}
while(true){
if (temp.next==null){
break;
}
System.out.println(temp.next.value);
temp=temp.next;
}
}
}
//单链表节点类
class Node{
int value; //值
Node next;
public Node(int value){ //构造函数
this.value=value;
}
@Override //复写toString()
public String toString() {
return "node{" + "value=" + value + ", next=" + next + '}';
}
}