利用堆栈补全表达式左括号(1309 P102)

这篇博客介绍了如何运用两个堆栈,其中一个为Double类型,来处理表达式中的左右括号问题。在运算过程中,先从堆栈中取出操作数和操作符,根据运算类型执行操作并将结果存回Double堆栈。最终,Double堆栈只剩下一个元素,即为表达式的结果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

本题实现两个方法,一个是补全表达式,showString, 另一个是计算二元方程式的结果(这里条件比较苛刻,每次只能为两个元素,且必须要有右括号的情况,不然程序失效)


showString
1.原理:
定义两个堆栈,一个是保存数据的Data型,Stack<String> data = new Stack<>();
另一个是保存操作符的ops型,Stack<String> ops = new Stack<>();

对原始数据进行历遍操作:
三种情况: 1.获得为操作数,放到操作数stack
                    2.获得为“)”(右括号),进行判断操作:
                        取得两个操作数,pop两次,
                        取得一个操作符,pop一次,
                        然后添加相关的“()”左右括号,并保存到dataStack中,执行push操作。
                    3.直接执行psuh 到data的操作。
这里画了一个操作草图;

(自己动手一画,逻辑就清楚了)

最后就可以得到完整的表达式。

getResult
  1. 同样需要两个stack存贮,逻辑与上面的类似,只是将其中的一个Stack类型改为Double型,每次执行都是先提取两个操作数和一个操作符,然后判断可以执行的类型,然后将结果放回到Double型的Stack中,并作为一个Double值继续参与运算。当最后执行完成的时候,其中Double的Stack只有一个元素存在,就是最后的结果。

代码如下:
public class Example1309 {

private static void getResult(String[] inputs){

Stack<String> ops = new Stack<>();
Stack<Double> vals = new Stack<>();
for (String input : inputs) {
//push ops
if (input.equals("+") || input.equals("-") || input.equals("*") || input.equals("/")) {
ops.push(input);
} else if (input.equals(")")) {
if (ops.isEmpty()) {
StdOut.println("ops.isEmpty()!");
return;
}
if (vals.isEmpty()) {
StdOut.println("vals.isEmpty()");
return;
}
//
Double temp2 = vals.pop();
Double temp1 = vals.pop();
String opt = ops.pop();
Double result = 0.0;
if (opt.equals("+")) {
result = temp1 + temp2;
} else if (opt.equals("-")) {
result = temp1 - temp2;
} else if (opt.equals("*")) {
result = temp1 * temp2;
} else if (opt.equals("/")) {
result = temp1 / temp2;
} else {
StdOut.println("the option " + opt + " is Error!");
return;
}
vals.push(result);

} else { // push vals
Double val = Double.parseDouble(input);
vals.push(val);
}
}
StdOut.println(vals.pop());
}

private static void showString(String[] inputs){
Stack<String> ops = new Stack<>();
Stack<String> data = new Stack<>();

for (String input : inputs){
if (input.equals("+") || input.equals("-") || input.equals("*") || input.equals("/")){
ops.push(input);
}else if (input.equals(")")){
if (ops.isEmpty()){
StdOut.println("ops is Empty!");
return;
}
if (data.isEmpty()){
StdOut.println("data is Empty!");
return;
}
String data1 = data.pop();
String data2 = data.pop();
String opt = ops.pop();
data.push("(" + data2 + opt + data1 + ")");

}else {
data.push(input);
}
}

StdOut.println(data.pop());

}


public static void main(String [] args){

String[] inputs = StdIn.readAllStrings(); //元素之间要加空格,ctrl+d结束输入
getResult(inputs);
//
showString(inputs);
}
}


运行结果图:


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值