没多大技巧,严格按照规则,记住即可:
转换过程需要用到栈,具体过程如下:
1)如果遇到操作数,我们就直接将其输出。
2)如果遇到操作符,则我们将其放入到栈中,遇到左括号时我们也将其放入栈中。
3)如果遇到一个右括号,则将栈元素弹出,将弹出的操作符输出直到遇到左括号为止。注意,左括号只弹出并不输出。
4)如果遇到任何其他的操作符,如(“+”, “*”,“(”)等,从栈中弹出元素直到遇到发现更低优先级的元素(或者栈为空)为止。弹出完这些元素后,才将遇到的操作符压入到栈中。有一点需要注意,只有在遇到" ) “的情况下我们才弹出” ( “,其他情况我们都不会弹出” ( "。
5)如果我们读到了输入的末尾,则将栈中所有元素依次弹出。
这个老哥讲得细致https://www.cnblogs.com/hantalk/p/8734511.html,但是代码有问题(若进来str[i]为除号或乘号那么也应该比一比,乘除要出栈)
下面是我的无懈可击代码!
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
char stack[100];
int top=-1;
int i = 0;
char str[200];
char que[200];
int rear=0,front=0;
printf("Type something.\n");
scanf("%s",str);
while(str[i] != '\0')
{
if(str[i] == '+' || str[i] == '-')//如果str[i]是加号或减号,则先弹出栈顶直到栈已空或栈顶元素为左括号,再将str[i]压入栈
{
if(top==-1)//若栈已空时,栈顶指针为空,找不到其元素,故须单独讨论
{
stack[++top]=str[i];
}
else
{
while(stack[top] == '+' || stack[top] == '-' || stack[top] == '*' || stack[top] == '/')
{
que[++rear]=stack[top--];
}
stack[++top]=str[i];
}
}
else if(str[i] == '*' || str[i] == '/')//如果str[i]是乘号或除号,则只有栈顶也是乘除号时才需要弹出
{
if(top==-1)//若栈已空时,栈顶指针为空,找不到其元素,故须单独讨论
{
stack[++top]=str[i];
}
else
{
while(stack[top] == '*' || stack[top] == '/')
{
que[++rear]=stack[top--];
}
stack[++top]=str[i];
}
}
else if(str[i] == '(')//如果str[i]是左括号则直接压入栈
{
stack[++top]=str[i];
}
else if(str[i] == ')')//如果str[i]是右括号,则打印并弹出栈中第一个左括号前的所有操作符,最后将此左括号直接弹出
{
while(stack[top] != '(')
{
que[++rear]=stack[top--];
}
stack[top--];
}
else//如果str[i]不是操作符则直接打印
{
que[++rear]=str[i];
}
i++;
}
while(top!=-1)//遍历后如果栈不为空,则弹出所有操作符
{
que[++rear]=stack[top--];
}
printf("\n输出\n");
while(rear!=front)
{
printf("%c",que[++front]);
}
return 0;
}