中缀表达

#include<stdio.h>
#include<stdlib.h>
#define OK 1
#define Error 0
typedef int Status;
//ջ
typedef struct StackNode
{
    char a;
    struct StackNode *next;
}StackNode,*LinkStack;

Status IniStack(LinkStack &S)
{
    S=NULL;
    return OK;
}

Status Isempty(LinkStack &S)
{
    if(S!=NULL)
        return Error;
    return OK;
}

Status Push(LinkStack &S,char e)
{
    LinkStack p;
    p=new StackNode;
    p->a=e;
    p->next=S;
    S=p;
    return OK;
}
Status Pop(LinkStack &S,char &e)
{
    LinkStack p;
    if(S==NULL)
        return Error;
    e=S->a;
    p=S;
    S=S->next;
    free(p);
    return OK;
}
char GetTop(LinkStack S)
{
    if(S!=NULL)
        return S->a;
    return Error;
}

int pp(char a)
{
    if(a=='/'||a=='*')
        return 1;
    return 0;
}


int main()
{
    char ass[400];
    LinkStack Q;
    int i;
    char k;
    IniStack(Q);
    gets(ass);
    for(i=0;;i++)
    {
        if(ass[i]=='\0')
            break;
        else if(ass[i]>='A'&&ass[i]<='Z')//alp
            printf("%c",ass[i]);
        else if(ass[i]=='(')//Z
            Push(Q,ass[i]);
        else if(ass[i]==')')//Y
        {
            int l;
            for(l=0;;l++)
            {
                Pop(Q,k);
                if(k=='(')
                    break;
                else
                    printf("%c",k);
            }
        }
        else
        {
            if(Isempty(Q)==1)
                Push(Q,ass[i]);
            else
            {
                int j;
                for(j=0;;j++)
                {
                    if(Isempty(Q)==0)
                    {
                        k=GetTop(Q);
                        if(pp(ass[i])<=pp(k)&&k!='(')
                        {
                            Pop(Q,k);
                            printf("%c",k);
                            continue;
                        }
                        else
                        {
                            Push(Q,ass[i]);
                            break;
                        }
                    }
                    Push(Q,ass[i]);
                    break;
                }
            }
        }
    }
    while(Isempty(Q)==0)
    {
        Pop(Q,k);
        printf("%c",k);
    }
    return 0;
}

 

posted @ 2021-06-21 11:20  Mr-Yao  阅读(51)  评论(0编辑  收藏  举报