数组、链表实现栈结构

数组实现:

详情见注释

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;  //指向下一个节点
}
发布了246 篇原创文章 · 获赞 22 · 访问量 4万+

猜你喜欢

转载自blog.csdn.net/gjs935219/article/details/104727478
今日推荐