栈的特点
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、 符号栈最后一个数字就是运算结果;
代码
省略~
版权声明:本文不是「本站」原创文章,版权归原作者所有 | 原文地址: