1. 程式人生 > >資料結構實驗之棧與佇列二:一般算術表示式轉換成字尾式 sdut-oj

資料結構實驗之棧與佇列二:一般算術表示式轉換成字尾式 sdut-oj

#include <stdio.h>
#include <stdlib.h>


#define STACK_INIT_SIZE 100
#define STACKINCREMENT 100


typedef struct{
    char *base;
    char *top;
    int stacksize;
}sqStack;


void initStack(sqStack *s)
{
    s->base = (char *)malloc(STACK_INIT_SIZE*sizeof(char));
    if(!s->base) exit(0);
    s->top = s->base;
    s->stacksize = STACK_INIT_SIZE;
}


void Push(sqStack *s,char e)
{
    if(s->top - s->base >= s->stacksize)
    {
        s->base = (char *)realloc(s->base,(s->stacksize+STACKINCREMENT)*sizeof(char));
        if(!s->base) exit(0);
        s->top = s->base + s->stacksize;
        s->stacksize +=STACKINCREMENT;
    }
    *(s->top) = e;
    s->top++;
}


void Pop(sqStack *s)
{
    if(s->top==s->base) return;
    s->top--;
}


int main()
{
    sqStack s;
    char ch;
    initStack(&s);
    while(~scanf("%c",&ch)&&(ch!='#'))
    {
        if(ch>='a'&&ch<='z')//如果是運算元直接輸出
            printf("%c",ch);
        else if(ch=='(')//如果是‘(’則壓入棧中
            Push(&s,ch);
        else if(ch==')')//如果是‘)’,依次出棧並輸出,直到取出和它匹配的‘(’為止,‘(’出棧丟棄
        {
            while(*(s.top-1)!='(')
            {
                printf("%c",*(s.top-1));
                Pop(&s);
            }
            Pop(&s);
        }
/*若是運算元,如果棧空或者該操作符的優先順序大於棧頂操作符則將其放入棧中;
**如果該操作符的優先順序小於等於棧頂操作符,則彈出棧中的操作符並輸出,
**直到該操作符的優先順序大於棧頂操作符或棧空,然後將該操作符入棧。
*/
        else if(ch=='+'||ch=='-')
        {
            if((s.top!=s.base)&&(*(s.top-1)!='('))
            {
                printf("%c",*(s.top-1));
                Pop(&s);
            }
            Push(&s,ch);
        }
        else if(ch=='*'||ch=='/')
        {
            if((s.top==s.base)||(*(s.top-1)!='*')||(*(s.top-1)!='/'))
                Push(&s,ch);
            else
            {
                printf("%c",*(s.top-1));
                Pop(&s);
                Push(&s,ch);
            }
        }
    }
    /*當讀到了中綴式的末尾時,如果棧非空則將所有元素依次彈出並輸出*/
    while(s.top!=s.base)
    {
        printf("%c",*(s.top-1));
        Pop(&s);
    }
    return 0;
}