1. 程式人生 > >棧應用:中綴轉字尾

棧應用:中綴轉字尾

沒多大技巧,嚴格按照規則,記住即可:
轉換過程需要用到棧,具體過程如下:
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; }