棧應用:中綴轉字尾
阿新 • • 發佈:2018-12-03
沒多大技巧,嚴格按照規則,記住即可:
轉換過程需要用到棧,具體過程如下:
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;
}