void trans(SqStack* s, char exp[], char postexp[])//引入中缀和后缀
{
char ch;
int i, j; //i为中缀exp的下标,j为后缀postexp的下标
s->top = 0;
ch = exp[i]; //
i++;
while (ch != '\0')
{
switch (ch)
{
case'(': //遇到左括号直接入栈
s->top++;
s->data[s->top] = ch;
break;
case')': //遇到右括号,栈顶元素不断出栈直到遇到左括号
while (s->data[s->top] != '(')
{
postexp[j] = s->data[s->top];
j++;
s->top--;
}
s->top--; //遇到了左括号,直接删除
break;
case'+': //因为加减的优先级最低,所以直接入栈
case'-':
while (s->top == 0 && s->data[s->top] != '(')
{ //栈不为空且没有遇到左括号,都直接出栈
postexp[j] = s->data[s->top];
j++;
s->top--;
}
s->top++; //即:栈为空或者遇到左括号,当前运算符进栈
s->data[s->top] = ch;
break;
case '*':
case '/':
while (s->top != -1 && s->data[s->top] != '(' && (s->data[s->top] == '*' || s->data[s->top] == '/')) {
postexp[j] = s->data[s->top]; //栈不为空且没有遇到左括号且遇到了同级符号:都出栈
j++;
s->top--;
}
s->top++; //不满足上述时,入栈
s->data[s->top] = ch;
break;
case ' ':break; //过滤空格
//default一般用在最后,表示非以上的任何情况下而发生的情况,
default:
while (ch >= '0' && ch <= '9') { //输入的是数字
postexp[j] = ch; //直接入栈
j++;
ch = exp[i]; //遍历下一个数字
i++;
}
i--;
postexp[j] = '#'; //用#标识一个数值串结束
j++;
break;
}
ch = exp[i];
i++;
}
while (s->top != -1) { //此时exp扫描完毕,栈不空时出栈并存放到postexp中
postexp[j] = s->data[s->top];
j++;
s->top--;
}
postexp[j] = '\0'; //添加结束标识,后缀表达式输入完毕
}
C/C++:栈的应用:中缀转后缀
最新推荐文章于 2024-10-08 16:16:22 发布