數組、鏈表實現棧結構

數組實現:

詳情見註釋

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;  //指向下一個節點
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章