练习:阅读一个用括号分组的算术表达式,并验证它的语法是否正确。
考虑:
1.括号正确关闭和打开,它们有成对的。
2. 字母应用作文字(大写或小写)。
3.检查运算符的正确使用(需要两个操作数)。
4. 括号正确打开和关闭表达式:(a + b) 而不是 (a + ) b。
我已经写了代码,我唯一的问题是,当我按照input: a+()
它给出的那样给出它时output: La expresion esta escrita de manera correcta
,它是不正确的,我该如何解决这个问题?
注意:代码编译得很好。
public class Prueba {
public static void main(String[] args) {
Scanner x = new Scanner(System.in);
System.out.println("De que tamaño sera su expresion?");
int n = x.nextInt();
LinkedList pila = new LinkedList();
LinkedList pila2 = new LinkedList();
LinkedList pila3 = new LinkedList();
LinkedList pp = new LinkedList();
LinkedList ppo = new LinkedList();
LinkedList pilaC = new LinkedList();
for (int i = 0; i < n; i++) {
System.out.println("Introduzca su elemento");
x.nextLine();
String e = x.nextLine();
pila.push(e);
pila2.push(e);
pila3.push(e);
}
int a = 0, b = 0;
while (!pila.isEmpty()) {
String element = (String) pila.pop();
if ((0 == element.compareTo(")")||0 == element.compareTo("("))
&& !pila.isEmpty()) {
String sim = (String) pila.pop();
if (0 == sim.compareTo("+") || 0 == sim.compareTo("-") || 0
== sim.compareTo("*") || 0 == sim.compareTo("/")) {
a++;
}
}
}
if (a != 0) {
System.out.println("La expresion no esta escrita de manera"+
"correcta");
} else {
while (!pila2.isEmpty()) {
String simbolo = (String) pila2.pop();
if ((0 == simbolo.compareTo("+") || 0 ==
simbolo.compareTo("-") || 0 == simbolo.compareTo("*") || 0 ==
simbolo.compareTo("/")) && !pila2.isEmpty()) {
String el = (String) pila2.pop();
if (0 == el.compareTo("(")||0 == el.compareTo(")") || 0
== el.compareTo("+") || 0 == el.compareTo("-") || 0 ==
el.compareTo("*") || 0 == el.compareTo("/")) {
b++;
}
}
}
if (b != 0) {
System.out.println("La expresion no esta escrita de manera"
+ "correcta :/");
} else {
while (!pila3.isEmpty()) {
String e = (String) pila3.pop();
if (0 == e.compareTo("(") || 0 == e.compareTo(")")) {
pp.push(e);
}
}
while (!pp.isEmpty()) {
ppo.push(pp.pop());
}
int w=0;
while(!ppo.isEmpty() && w!=1){
String s=(String)ppo.pop();
if(0==s.compareTo("(") && !pilaC.isEmpty())
pilaC.pop();
else{
if(0==s.compareTo("(") && pilaC.isEmpty()){
System.out.println("La expresion no esta"+
"escrita de manera correcta ");
w=1;
}
else
pilaC.push(s);
}
}
if(w==1)
System.out.println();
else
{
if(!pilaC.isEmpty())
System.out.println("La expresion no esta escrita de"+
"manera correcta ");
else
System.out.println("La expresion esta escrita de"+
"manera correcta :)");
}
}
}
}
}
很好,就像我在回答您与该主题相关的问题时所做的那样,我将尝试向您展示一个易于理解和处理的代码。
以前的评论
让我们首先忘记所有这些堆栈,我们只需要一个list。另一方面,为了更容易调试,我们将创建一个函数来简化条件。
概念
我们要做的是遍历我们的列表并分析当前和前一个之间的元素。例如:如果我的当前元素是(,前一个必须是强制运算符+,-,/,*,否则表达式是错误的。
代码
代码注释
请注意有关代码的几件事:
{}
设置在所有块中。我建议您尝试习惯遵循良好的代码风格。即使是单行条件,我也使用花括号。x.nextLine();
内的情况for
。输入/输出示例
希望您理解并为您服务。
仅使用电池的练习解决方案:
注意:就像 DanielGS 的回答一样,如果
input: a+()
,output:"La expresion es correcta"
。一定是这样,因为他说的是要a
添加"vacio" o () o 0
。