如何实现栈
如何利用栈将中缀表达式转换为后缀表达式
题目
我们平常使用的计算表达式都是中缀表达式,而输入计算机后会转换为后缀表达式,即计算机只能计算后缀表达式,那么如何计算机是如何计算后缀表达式的值的呢?
算法
1)从左到右扫描后缀表达式字符串
2)初始化一个空栈
3)如果扫描到数字,那么就直接入栈
4)如果被扫描的字符是一个二元运算符,那么就连续出栈两次,获得两个字符,元素出栈后,应用运算符进行计算,并将结果压栈
5)重复3)和4)的操作,直至扫描完字符串
6)扫描完所有字符串之后,栈中只剩一个元素,该元素就是最终结果,将其出栈并返回。
Java版本实现
//计算后缀表达式算法
static Double calculator(String curString) {
LLStack<Double> stack = new LLStack<>();
for(int i = 0; i < curString.length(); i++) {
String t = curString.substring(i , i + 1 );
if(t.charAt(0) >= '0' && t.charAt(0) <= '9' ) {
//数字直接入栈
stack.push(Double.parseDouble(t));
}else {
double a , b = 0;
a =(Double) stack.pop();
b =(Double) stack.pop();
switch(t){
case "*" : stack.push(b * a);System.out.println(t+":" + b * a);break;
case "/" : stack.push(b / a);System.out.println(t+":" + b / a);break;
case "+" : stack.push(b + a);System.out.println(t+":" + (double)(b + a));break;
case "-" : stack.push(b - a);break;
case "%" : stack.push(b % a);break;
}
}
}
return stack.pop() ;
}
栈的实现
class LLNode<T>{
private T data;
private LLNode next = null;
public LLNode(T d){
data = d;
}
public T getData() {
return data;
}
public void setData(T data) {
this.data = data;
}
public LLNode getNext() {
return next;
}
public void setNext(LLNode next) {
this.next = next;
}
}
public class LLStack<T> {