如何实现栈
如何在将中缀表达式转换为后缀表达式之前使用栈来判定括号是否匹配
两种表达式
中缀 | 后缀 |
---|---|
A+B | AB+ |
A+B*C | ABC*+ |
(A+B)*C-D | AB+C * D- |
重要性质
- 中缀表达式1+2 * 4和后缀表达式124 * +中,数字顺序是一样的,只有算术符号顺序不一样
- 只需一个栈就可以把中缀转后缀,利用栈把表达式中的运算符次序从中序改为后序。栈中只存放运算符和左括号,由于后缀表达式中不存在括号,所以输出的时候将不输出括号。
算法
a)创建一个栈
b)while(字符串未结束)
if(t是操作数) 输出t
else if(t是右括号)
出栈并输出该符号,直至一个匹配的左括号出栈(但左括号不输出)
else
当栈非空且t的优先级不大于栈顶元素时,出栈并输出
t入栈
c)当栈非空的时候,出栈并输出所有字符
Java版本实现
//中缀转后缀算法
static String MinddleTurnToBack(String curString) {
LLStack stack = new LLStack();
String result = "" ;
System.out.print("中缀表达式转换为后缀表达式:");
for(int i = 0; i < curString.length(); i++) {
char t = curString.charAt(i);
if(isNumber(t)) {
//数字直接输出
System.out.print(t);
result = result + t;
}else if((t == ')' || t == ']' || t == '}')) {
//当栈顶不是‘(’时,出栈并输出
while(!stack.isEmpty() && stack.top() != '(' && stack.top() != '[' && stack.top() != '{'){
result += stack.top();
System.out.print((char)stack.pop());
}
//直到栈顶是‘(’
if (!stack.isEmpty())
stack.pop();
}else {
//操作符或‘(’
//当栈非空且t的优先级不大于栈顶元素时,出栈并输出然后t入栈
while(!stack.isEmpty() && isPriority((char)stack.top(), t)) {
result += stack.top();
System.out.print((char)stack.pop());
}
stack.push(t);
}
}
while(!stack.isEmpty()) {
result += stack.top();
System.out.