数据结构与算法-栈-笔记整理《五》

栈的特点

  1. 栈是一个先入后出的有序列表
  2. 栈顶为变化的一端允许删除与插入、栈底为固定的一端

栈的实现思路

  1. 使用一个数组stack[]来存储栈元素
  2. 定义一个栈顶指针top,默认值为-1
  3. 有元素入栈操作时,top++;stack[top]=data;
  4. 出栈操作:int value = stack[top];top–;return value;

代码实现

public class ArrayStackDemo {

	public static void main(String[] args) {
		ArrayStack stack = new ArrayStack(4);
		stack.push(1);
		stack.push(2);
		stack.push(3);
		stack.list();
		stack.pop();
		stack.list();
	}

}

//定义一个 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;
	}
	//入栈-push
	public void push(int value) {
		//先判断栈是否满
		if(isFull()) {
			System.out.println("栈满");
			return;
		}
		top++;
		stack[top] = value;
	}
	//出栈-pop, 将栈顶的数据返回
	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]);
		}
	}
	
}

用栈实现一个计算器

设计思路

  1. 创建数栈,符号栈两个栈,一个用来载入操作符,一个用来载入数字
  2. 创建一个索引来扫描计算表达式
  3. 如果扫描到一个符合,分两种情况:
    3.1 如果符号栈为空,直接入栈
    3.2 如果符号栈有操作符、就进行比较, 如果当前操作符优先级小于等于栈中的操作符,就从栈中pop两个数,从符号栈中pop出一个符号,进行运算,将得到的结果入数栈,然后将当前操作符入符号栈;如果当前操作符优先级大于栈中的操作符就直接入符号栈;
  4. 表达式扫描完毕,顺序的从数栈和符号栈pop出相应的数和符号,并运行放入数栈,并重复4中的步骤直到符号栈剩下最后一个数字
  5. 符号栈最后一个数字就是运算结果

代码

省略~


版权声明:本文为jingyangV587原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。