上一节介绍了栈和队列两种数据结构,这里接介绍一个栈和队列的综合应用:计算表达式
计算表达式
以前做小练习的时候也做过小的计算器,对表达式的计算是很重要也是很头疼的一部分,这里就来看看如何使用栈和队列来实现。
计算表达式分两步:
- 将算术表达式转换为后缀表达式。
- 计算后缀表达式的值。
中缀表达式 | 后缀表达式 |
---|---|
A+B-C | AB+C- |
A*B/C | AB*C/ |
A+B*C | ABC*+ |
A*(B+C) | ABC+* |
A*B+C*D | AB*CD*+ |
A+B*(C-D/(E+F)) | ABCDEF+/-*+ |
举例一个计算过程:
中缀表达式转换为后缀表达式的转换规则:
中缀表达式读取的字符 | 动作 |
---|---|
操作数 | 写至输出 |
左括号 | 压入栈 |
右括号 | 栈非空时重复一下步骤:弹出一项,若项不为(,则写至输出,若为(退出循环 |
代码实现:
import java.io.*;
class StackX
{
private int maxSize;
private char[] stackArray;
private int top;
public StackX(int s) // constructor
{
maxSize = s;
stackArray = new char[maxSize];
top = -1;
}
public void push(char j) // 压入数据项至栈顶
{ stackArray[++top] = j; }
public char pop() // 从栈顶拿走一项元素 (栈大小改变)
{ return stackArray[top--]; }
//--------------------------------------------------------------
public char peek() // 获取栈顶元素 (只获得栈顶元素 栈不变)
{ return stackArray[top]; }
//--------------------------------------------------------------
public boolean isEmpty() // 判断是否为空
{ return (top == -1); }
//-------------------------------------------------------------
public int size() // 获取栈大小
{ return top+1; }
//--------------------------------------------------------------
public char peekN(int n) // 获取指定元素
{ return stackArray[n]; }
//--------------------------------------------------------------
public void displayStack(String s)
{
System.out.print(s);
System.out.print("Stack (bottom-->top): ");
for(int j=0; j<si