05、数据结构与算法-栈-笔记整理

栈的特点

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

栈的实现思路

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

代码实现

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、 符号栈最后一个数字就是运算结果;

代码

省略~

版权声明:本文不是「本站」原创文章,版权归原作者所有 | 原文地址: