數組實現:
詳情見註釋
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; //指向下一個節點
}