中缀表达式转后缀表达式*C语言

1.源代码

#include<malloc.h>
#include<stdio.h>
#include<string.h>
int KKK=1; //定义全局变量用于判断
typedef struct StackNode//链表结构体1
{
    char data;
    struct StackNode *next;
}StackNode,*LinkStackPtr;
typedef struct Stack//链表结构体2
{
    int data;
    struct Stack *next;
}Stack,*Link;
typedef struct//栈顶结构体1
{
    LinkStackPtr top;
    int count;
}LinkStack,*Sptr;
typedef struct//栈顶结构体2
{
    Link top;
    int cout;
}LinkA,*Spt;
Sptr InitList1()//分配运算符的栈的初始化1
{
    Sptr head=(Sptr)malloc(sizeof(LinkStack));
    head->count=0;
    LinkStackPtr s=(LinkStackPtr)malloc(sizeof(StackNode));
    s->data='#';
    head->top=s;
    return head;
}
Sptr InitList2()//栈的初始化2
{
    Sptr head=(Sptr)malloc(sizeof(LinkStack));
    head->count=0;
    head->top=NULL;
    return head;
}
Spt InitList3()//栈的初始化3
{
    Spt head=(Spt)malloc(sizeof(LinkA));
    head->cout=0;
    head->top=NULL;
    return head;
}
void Push(Sptr S,char e)//添加栈顶元素 1
{
    LinkStackPtr s=(LinkStackPtr)malloc(sizeof(StackNode));
    s->data=e;
    s->next=S->top;
    S->top=s;
    S->count++;
}
void Push2(Spt S,char e)//添加栈顶元素2
{
    Link s=(Link)malloc(sizeof(Stack));
    s->data=(int)e-48;
    s->next=S->top;
    S->top=s;
    S->cout++;
}
int Pop1(Sptr S)//删除栈顶元素1
{
    LinkStackPtr p;
    if(S->top==NULL){printf("stack is empty\n");return 0;}
    else{
    p=S->top;
    S->top=p->next;
    free(p); 
    S->count--;
    }
}
int Pop2(Sptr S,char *A)//删除栈顶元素同时提取栈顶元素 
{
    LinkStackPtr p;
    if(S->top==NULL){printf("stack is empty\n");return 0;}
    else{
    p=S->top;
    S->top=p->next;
    *A=p->data;
    free(p); 
    S->count--;
    }
}
int Pop3(Spt S)//删除栈顶元素2
{
    Link p;
    if(S->top==NULL){printf("stack is empty\n");return 0;}
    else{
    p=S->top;
    S->top=p->next;
    free(p); 
    S->cout--;
    }
}
int deal(char sss[])
{
    int S1=0,T=0,A=1;
    int l=strlen(sss);
    for(int i=0;i<l;i++)
    {
        if(sss[i]=='(')
            S1++;
        if(sss[i]==')')
        {
            if(S1!=0)
                S1--;
            else
                T++;
        }
    }
    for(int i=0;i<l;i++)
    {
        if(sss[i]!='+'&&sss[i]!='-'&&sss[i]!='*'&&sss[i]!='/'&&sss[i]!='('&&sss[i]!=')')
        {
            if(sss[i]>'9'||sss[i]<'0')
            {
                A=0;
            }
        }
    }
    for(int i=0;i<l-1;i++)
    {
        if(sss[i+1]!='+'&&sss[i+1]!='-'&&sss[i+1]!='*'&&sss[i+1]!='/'&&sss[i+1]!='('&&sss[i+1]!=')')
        {
            if((sss[i]>='0'&&sss[i]<='9')&&(sss[i+1]>='0'&&sss[i+1]<='9'))
            {
                A=0;
            }
        }
    }
    if(S1==0&&T==0)
    {}
    else
    {
        A=0;
    }
    for(int i=0;i<l-1;i++)
    {
        if(sss[0]=='+'||sss[0]=='-'||sss[0]=='*'||sss[0]=='/')
        {
            A=0;
        }
        if((sss[i]=='+'||sss[i]=='-'||sss[i]=='*'||sss[i]=='/')&&(sss[i+1]=='+'||sss[i+1]=='-'||sss[i+1]=='*'||sss[i+1]=='/'))
        {
            A=0;
        }
    }
    return A;
}
Sptr invert1(char sss[])//中缀表达式转化为后缀表达式 
{
    Sptr S1=InitList1();//分配运算符的栈
    Sptr S2=InitList2();//分配数的栈
    char A;//定义的全局变量,用于两个栈元素之间的转移 
    int l=strlen(sss);
    for(int i=0;i<l;i++)
    {
        if(sss[i]>='0'&&sss[i]<='9')
        {
            Push(S2,sss[i]);//数字入栈
        }
        else
        if(sss[i]=='+'||sss[i]=='-'||sss[i]=='*'||sss[i]=='/')
        {
            if(S1->top->data=='#')
            {
                Push(S1,sss[i]);//运算符入栈
            }
            else
            {
                if((S1->top->data=='*'||S1->top->data=='/')&&(sss[i]=='+'||sss[i]=='-'))
                {
                    while(S1->top->data!='#'&&S1->top->data!='(')
                    {
                        Pop2(S1,&A);
                        Push(S2,A);
                    }
                    Push(S1,sss[i]);
                }
                else
                if((S1->top->data=='*'||S1->top->data=='/')&&(sss[i]=='*'||sss[i]=='/'))
                {
                    while(S1->top->data!='#'&&S1->top->data!='(')
                    {
                        if(S1->top->data=='*'||S1->top->data=='/')
                        {
                            Pop2(S1,&A);
                            Push(S2,A);
                        }
                        else
                        {
                            break;
                        }
                    }
                    Push(S1,sss[i]);
                }
                else
                if((S1->top->data=='+'||S1->top->data=='-')&&(sss[i]=='*'||sss[i]=='/'))
                {
                    Push(S1,sss[i]);
                }
                else
                if((S1->top->data=='+'||S1->top->data=='-')&&(sss[i]=='+'||sss[i]=='-'))
                {
                    while(S1->top->data!='#'&&S1->top->data!='(')
                    {
                        Pop2(S1,&A);
                        Push(S2,A);
                    }
                    Push(S1,sss[i]);
                }
                else
                if(S1->top->data=='(')
                {
                    Push(S1,sss[i]);
                }
            }
        }
        else
        if(sss[i]=='(')
        {
            Push(S1,sss[i]);
        }
        else
        if(sss[i]==')')
        {
            while(S1->top->data!='(')
            {
                Pop2(S1,&A);
                Push(S2,A);
            }
            Pop1(S1);
        }
    }
    while(S1->top->data!='#')//表达式录入结束后将S1中剩余的运算符转移到S2中 
    {
        Pop2(S1,&A);
        Push(S2,A);
    }
    return S2;
}
Sptr invert2(Sptr S1)//将栈中的元素倒置 
{
    Sptr S2=InitList2();
    char A;//定义的全局变量,用于两个栈元素之间的转移 
    while(S1->top!=NULL)
    {
        Pop2(S1,&A);
        Push(S2,A);
    }
    return S2;
}
Spt operation(Sptr S1)
{
    Spt S2=InitList3();
    char A;//定义的全局变量,用于两个栈元素之间的转移 
    int B;//定义的全局变量,用于两个栈元素之间的转移 
    while(S1->top!=NULL)
    {
        if(S1->top->data!='+'&&S1->top->data!='-'&&S1->top->data!='*'&&S1->top->data!='/')
        {
            Pop2(S1,&A);
            Push2(S2,A);
        }
        else
        {
            if(S1->top->data=='+')
            {
                Pop2(S1,&A);//移除符号位
                B=S2->top->next->data+S2->top->data;
                Pop3(S2);
                S2->top->data=B;
            }
            else
            if(S1->top->data=='-')
            {
                Pop2(S1,&A);//移除符号位
                B=S2->top->next->data-S2->top->data;
                Pop3(S2);
                S2->top->data=B;
            }
            else
            if(S1->top->data=='*')
            {
                Pop2(S1,&A);//移除符号位
                B=S2->top->next->data*S2->top->data;
                Pop3(S2);
                S2->top->data=B;
            }
            else
            if(S1->top->data=='/')
            {
                Pop2(S1,&A);//移除符号位
                if(S2->top->data!=0)
                {
                    B=S2->top->next->data/S2->top->data;
                    Pop3(S2);
                    S2->top->data=B;
                }
                else
                {
                    KKK=0;
                    break;
                }
            }
        }
    }
    return S2;
}
void List(LinkA *L)//打印链表 
{
    Link p;
    p=L->top;
    printf("输出的值为:\n");
    while(p!=NULL)
    {
       printf("%d ",p->data);
       p=p->next;
    }
    printf("\n");
}
//打印链表
Sptr ZZZZ(LinkStack *L)
{
    LinkStackPtr p;
    p=L->top;
    Sptr q=InitList2();
    char A;
    while(p!=NULL)
    {
        A=p->data;
        Push(q,A);
        p=p->next;
    }
    return q;
}
void List1(LinkStack *L)
{
    LinkStackPtr p;
    p=L->top;
    printf("后缀表达式为:\n");
    while(p!=NULL)
    {
       printf("%c ", p->data);
       p=p->next;
    }
    printf("\n");
}
int main()//主函数 
{
    printf("(注意:输入的数字的范围为[0,9])\n");
    printf("输入样例:(1+1)\n");
    printf("请输入中缀表达式:");
    char sss[1000];
    gets(sss);
    int A=deal(sss);
    Sptr S1=invert1(sss);
    S1=invert2(S1);
    Sptr S=ZZZZ(S1);
    S=invert2(S);
    Spt S2=operation(S1);
    if(A==1&&KKK==1)
    {
        printf("输入的中缀表达式合法\n");
        List1(S);
        List(S2);
    }
    else
    {
        printf("输入的中缀表达式不正确!");
    }
}

2.运行过程

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

胡闹的

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值