输入是数学表达式(例如1 + 2 + 3/4 * 5。或((1 + 2)+3)/ 4)* 5。 ...)带点'。'作为输入的结束。
我必须编写一个算法,根据某些算术规则确定表达式是否正确写入:
- 所有括号必须关闭
- 两个操作员不能相互站立(例如2 ++ 2)
- 两个数字不能相互靠近(例如12 + 2)
- 没有' *'数字与括号之间(例如2(2 + 2)* 3)
- 只能使用数字,运算符和三种括号
- 括号之间没有任何内容(例如())
我几乎已经覆盖了所有这些但我无法弄清楚如何让算法认识到这个例子是错误的: 9 + 6/5 *(1 + 2 + 3)]。 - 括号顺序混淆的地方
#include <stdio.h>
#include <stdlib.h>
#define MAX 100
int main()
{
char expression[MAX];
int i, j, parenthesisNr = 0, mistake = 0, tmpOp;
for (i = 0; i < MAX; i++){
scanf("%c", &expression[i]);
if (expression[i] < '(' || expression[i] > '9'){
if (expression[i] != '[' && expression[i] != ']' && expression[i] != '{' && expression[i] != '}')
mistake ++;
}
else if (expression[i] == '.'){
break;
}
}
for (i = 0; i < MAX; i++){
if (expression[i] == '(' || expression[i] == ')'){
parenthesisNr ++;
}
if (expression[i] == '*' || expression[i] == '+' || expression[i] == '/' || expression[i] == '-'){
tmpOp = expression[i];
for (j = i + 1; j < i+2; j++){
if (expression[j] == tmpOp){
mistake ++;
}
}
}
if (expression[i] >= '0' && expression[i] <= '9'){
for (j = i + 1; j < i + 2; j++){
if (expression[j] == '(' || expression[j] == '[' || expression[j] == '{' || (expression[j] >= '0' && expression[j] <= '9')){
mistake ++;
}
}
}
}
if (parenthesisNr % 2 == 1){
printf ("WRONG");
}
else if (mistake > 0){
printf ("WRONG");
}
else{
printf ("CORRECT");
}
return 0;
}
答案 0 :(得分:0)
处理括号检查的最简单方法是使用堆栈。
检查&#34;括号的不同风格&#34;或&#34;括号&#34;将开头的括号推到堆栈上。当您遇到右括号时弹出堆栈并检查弹出的左括号是否与右括号匹配。