栈(stack)
栈是限制线性表中元素插入和删除只能在线性表同一端进行的特殊线性表。
数组模拟栈
定义一个栈
class ArrayStack {
private int maxSize;//栈的大小
private int[] stack;//数组,数组模拟栈
private int top=-1;
//构造器
public ArrayStack(int maxSize){
this.maxSize=maxSize;
stack=new int[this.maxSize];
}
//判断栈满
public boolean isFull(){
return top==this.maxSize-1; //不是用数组stack的长度去比较,用变量top去比较
}
//判断栈空
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()){
System.out.println("栈空")
return;
}
int value= stack[top];//这个中间变量value是必要的
top--;
return value;
}
//遍历栈
public void list(){
if(isEmpty()){
System.out.println("栈空")
return;
}
//倒着遍历数组stack
for(int i=top; i>=0; i--)
System.out.printf("stack[%d]=%d\n",i,stack[i]);
}
}
测试我们自己定义的的数组栈
public static void main(String[] args){
ArrayStack stack=new ArrayStack(4);
String key="";
boolean loop=true;
Scanner scanner=new Scannner(System.in);
System.out.println("show:表示显示栈");
System.out.println("exit:退出程序");
System.out.println("push:入栈");
System.out.println("pop:出栈");
System.out.println("请输入你的选择");
key=scanner.next();
switch(key){
case "show":
stack.list();
break;
case "push":
System.out.println("请输入一个整数");
int value=scanner.nextInt();
stack.push(value);
break;
case "pop":
try{
int res=stack.pop();
System.out.printf("出栈的数据是%d\n",res);
}catch(EXception e){
System.out.println(e.getMessage());
}
break;
case "exit":
scanner.close();
loop=false;
break;
default:
break;
}
}
使用栈完成表达式的计算思维
定义俩个栈,一个数栈,一个符号栈。
1、扫描发现是一个数字,就直接入数栈。扫描发现一个符号,如果当前符号栈为空,就直接入符号栈。
2、如果符号栈有操作符,就进行比较
如果当前的操作符优先级小于等于栈中的操作符,就需要从数栈中pop出俩个数,在符号栈中pop出一个符号,进行运算。将得到的结果入数栈。将当前的操作符入符号栈
如果当前的操作符优先级大于栈中的操作符,就直接入符号栈。
3、当表达式扫描完毕,就顺序的从数栈和符号栈pop出相应的数和符号