中缀表达式求值练习
不知道为什么,栈这一章节两大难点,中缀表达式和递归化为非递归我暑假都学习过,做过题目,结果一开学又懵懂了。好在看了一看又回忆起来了,所以决定各做一个练习,以加深理解。以下是朴素的中缀表达式求值代码。
#include<stdio.h>
char expr[1000];
char op[1000],top=-1;
int stack[1000],tst=-1;
int num;
void show()
{
for (int i=0;i<=top;i++)
printf("%c ",op[i]);
printf("(%d)\n",top);
for (int i=0;i<=tst;i++)
printf("%d ",stack[i]);
printf("(%d)\n",tst);
printf("___________________________\n");
return;
}
void pop()
{
switch (op[top])
{
case '+':stack[tst-1]+=stack[tst];break;
case '-':stack[tst-1]-=stack[tst];break;
case '*':stack[tst-1]*=stack[tst];break;
case '/':stack[tst-1]/=stack[tst];break;
}
top--;
tst--;
return;
}
bool isNum(char *ch)
{
return '0'<=*ch && *ch<='9';
}
int main()
{
scanf("%s\n",expr);
for (char* ch=expr;*ch;ch++)
{
if (isNum(ch))
{
num=num*10+*ch-'0';
if (!isNum(ch+1))
{
stack[++tst]=num;
num=0;
}
}
if (*ch==' ')
continue;
switch (*ch)
{
case '+':
case '-':
while (op[top]=='+' || op[top]=='-' || op[top]=='*' || op[top]=='/')
pop();
op[++top]=*ch;
break;
case '*':
case '/':
while (op[top]=='*' || op[top]=='/')
pop();
op[++top]=*ch;
break;
case '(':
op[++top]='(';
break;
case ')':
while (op[top]!='(')
pop();
top--;
break;
}
//show();
}
while (top>=0)
pop();
printf("%d\n",stack[0]);
}