栈的一个实际需求
输入一个表达式(
注意这里是整体输入一个表达式
),如:[7*2*2-5+1-5+3-3]
对于计算机而言,它接收到的是一个字符串,那么计算机是如何运算并得到结果的呢? —>栈
栈的介绍
- 栈的英文为:stack
- 栈是一个先入后出的有序列表,(类比枪的弹夹)
- 栈是限制线性表中元素的插入和删除只能在线性表的同一端进行的一种特殊线性表。
- 允许元素插入和删除的一端称为栈顶,另一端为固定的一端,称为栈底。
- 根据栈的定义可知,最先放入栈中的元素在栈底,最后放入的元素在栈顶,而删除的元素正好相反,最后放入的元素最先删除,最先放入的元素最后删除。
栈的快速入门
实现栈的思路分析 :
- (1)使用数组模拟栈;
- (2)定义一个top来表示栈顶,初始化为-1;
- (3)入栈的操作,当有数据加入到栈时,top++,stack[top] = data;
- (4)出栈操作,int value = stack[top]; top–; return value
先创建一个Stack类
//定义一个ArrayStack表示栈
class ArrayStack{
private int maxSize; //栈的大小
private int[] stack; //数组,数组模拟栈,数据就放在该数组中
private int top = -1; //表示栈顶,初始化为-1,表示还没有数据
public ArrayStack(int maxSize) {
this.maxSize = maxSize;
stack = new int[maxSize];
}
}
一个栈需要以下几个功能:
1、出栈
2、入栈
3、判断栈空
4、判断栈满
5、遍历栈
//判断栈满
public boolean isFull(){
return top == maxSize-1;
}
//判断栈空
public boolean isEmpty(){
return top == -1;
}
//入栈
public void push(int value){
//入栈需要判断是否栈满
if(isFull()){
System.out.println("栈满!");
return;
}
System.out.println(value+"入栈");
stack[++top] = value;
}
//出栈
public int pop(){
//判断是否栈空
if (isEmpty()){
System.out.println("栈空!");
return -1;
}
return stack[top--];
}
//遍历栈
public void list(){
if (isEmpty()){
System.out.println("栈空!");
return;
}
//出栈从栈顶先出
for (int i = top; i >=0 ; i--) {
System.out.println("stack["+i+"] = "+stack[i]);
}
}
测试代码:
public static void main(String[] args) {
ArrayStack stack = new ArrayStack(10);
//入栈操作
for (int i = 0; i < 10; i++) {
int count = new Random().nextInt(10);
stack.push(count);
}
//出栈操作
for (int i = 0; i < 10; i++) {
int pop = stack.pop();
if (pop != -1) {
System.out.println(pop + "出栈");
}
}
}
运行结果: