数组实现:
详情见注释
package stack;
import java.util.Scanner;
public class ArrayStackDemo
{
public static void main(String[] args)
{
//测试一下ArrayStack是否正确
//先创建一个ArrayStack对象,表示栈
ArrayStack stack = new ArrayStack(4);
String key = "";
Scanner sc = new Scanner(System.in);
boolean loop = true; //控制是否退出菜单
while(loop)
{
System.out.println("show:表示显示栈");
System.out.println("exit:退出程序");
System.out.println("push:入栈");
System.out.println("pop:出栈");
System.out.println("输入你的选择~");
key = sc.next();
switch(key)
{
case "show":
stack.list();
break;
case"push":
System.out.println("请输入一个数 : ");
int value = sc.nextInt();
stack.push(value);
break;
case "pop":
try
{
int res = stack.pop();
System.out.println("出栈的数据是 : " + res);
}
catch(Exception e)
{
System.out.println(e.getMessage());
}
break;
case"exit":
sc.close();
loop = false;
break;
default:
break;
}
}
System.out.println("程序退出~");
}
}
//定义一个ArrayStack表示栈
class ArrayStack
{
private int maxSize; //最大容量
private int[] stack; //数组模拟栈,数据就放在该数组中
private int top = -1; //top表示栈顶,初始化为-1
//构造器
public ArrayStack(int maxSize)
{
this.maxSize = maxSize;
stack = new int[this.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]);
}
}
}
链表实现:
package stack;
import java.util.Scanner;
public class SingleLinkedListStackDemo
{
public static void main(String[] args)
{
//测试一下ArrayStack是否正确
//先创建一个ArrayStack对象,表示栈
ListStack stack = new ListStack();
String key = "";
Scanner sc = new Scanner(System.in);
boolean loop = true; //控制是否退出菜单
while(loop)
{
System.out.println("show:表示显示栈");
System.out.println("exit:退出程序");
System.out.println("push:入栈");
System.out.println("pop:出栈");
System.out.println("输入你的选择~");
key = sc.next();
switch(key)
{
case "show":
stack.list();
break;
case"push":
System.out.println("请输入一个数 : ");
int value = sc.nextInt();
stack.push(value);
break;
case "pop":
try
{
int res = (int) stack.pop();
System.out.println("出栈的数据是 : " + res);
}
catch(Exception e)
{
System.out.println(e.getMessage());
}
break;
case"exit":
sc.close();
loop = false;
break;
default:
break;
}
}
System.out.println("程序退出~");
}
}
class ListStack
{
//初始化头结点
Node top = new Node();
void init()
{
top.next = null;
top.data = null;
}
//采用头插法的方式模拟入栈
public void push(int value)
{
Node e = new Node();
e.data = value;
if(top.next == null)
{
top.next = e;
}
else
{
e.next = top.next;
top.next = e;
}
}
//出栈
public Object pop() //弹出栈顶元素,也就是头结点的后一个元素
{
if(top.next == null)
{
System.out.println("栈空,已无元素~");
return null;
}
Object value = top.next.data;
top.next = top.next.next;
return value;
}
public void list() {//打印栈中存在的元素
Node temp = top;
if(temp.next==null)
{
System.out.println("栈为空!");
}
while (temp.next != null) {
System.out.println(temp.next.data + " ");
temp = temp.next;
}
}
}
//定义HeroNode,每个HeroNode对象就是一个节点
class Node
{
public Object data;
public Node next; //指向下一个节点
}