数据结构与算法分析中缀变后缀

//头文件

#ifndef _Three20_H
typedef struct Node *PtrToNode;
typedef PtrToNode Stack;
typedef PtrToNode Position;
Stack CreateStack();
char PopTop(Stack s);
void Push(Stack s,char c);
struct Node{
    char c;
    Position next;
};

#endif

//后缀变中缀

#include

#include "three20.h"

#include

//建栈

Stack CreateStack()
{
    Stack s;
    s=(Stack)malloc(sizeof(struct Node));
    if(s==NULL)
    {
        printf("error");
        return NULL;
    }
    s->next=NULL;
    return s;

}

//出栈并返回栈顶元素

char PopTop(Stack s)
{
    Position p;
    int ch;
    if(s->next==NULL)
    {
        printf("error");
        return NULL;
    }
    else
    {
        p=s->next;
        ch=p->c;
        s->next=s->next->next;
        free(p);

    }
    return ch;

}

//返回栈顶元素

char Top(Stack s)
{
    if(s->next==NULL)
        {
            printf("error");
            return NULL;
        }
    else
    {
        return s->next->c;
        
    }

}

//出栈

void Pop(Stack s)
{
    Position p;
    if(s->next==NULL)
    {
        printf("error");
        return;
    }
    else
    {
        p=s->next;
        s->next=s->next->next;
        free(p);

    }

    

}

//入栈

void Push(Stack s,char c)
{
    Position p;
    p=(Position)malloc(sizeof(struct Node));
    if(p==NULL)
    {
        printf("error");
        return;
    }
    else
    {
        p->c=c;
        p->next=s->next;
        s->next=p;
    }

}

//设符号优先级

int Property(char c)
{
    switch(c)
    {
        case('+'):
        case('-'):
            return 1;
            break;
        case('*'):
        case('/'):
            return 2;
            break;
        default:
            return 0;

    }

}
main()
{
    char c,top;
    char a[100];
    int i=0;
    Stack s=CreateStack();
    /*输入分为两种情况
    1.是符号:1)输入的是加减乘除号,a.栈为空或者栈顶元素为'('时,直接入栈;
                                     b.如果不是,就比较该符号和栈顶符号的优先级,栈顶优先级大于等于该符号优先级时,栈顶弹出,该符号入栈;
                                                                                 栈顶优先级小于该符号优先级时,该符号入栈。
                      2)输入的是'(':入栈
                      3)如果输入的是')':弹出栈顶元素存储在数组中直到栈顶的元素为'(','('弹出不存在数组中;
             
    2.是数字:直接存储在数组中;
    最后把栈内剩余的元素都存储在数组中。
    */
    while((c=getchar())!='#')
    {
        if(c=='+'||c=='-'||c=='*'||c=='/'||c=='('||c==')')
        {
            if(c=='+'||c=='-'||c=='*'||c=='/')
            {
                
                if(s->next!=NULL&&Top(s)!='(')
                {
                    if( Property(c)<=Property(Top(s)))
                    {
                        top=PopTop(s);
                        a[i++]=top;
                        Push(s,c);
                    }
                    else
                        Push(s,c);
                
                }
                else
                    Push(s,c);
            
            }    
            else if(c=='(')
            {
                Push(s,c);

            }
            else
            {
                while((top=Top(s))!='(')
                {
                    a[i++]=top;
                    Pop(s);
                }
                Pop(s);
            }
        }
        else
            a[i++]=c;
            
    
    }
    while(s->next!=NULL)
    {
        
        a[i++]=s->next->c;
        Pop(s);
    }
    a[i]='\0';
    printf("%s",a);
    
}

你可能感兴趣的:(算法)