欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

利用栈实现中缀表达式转后缀表达式,再利用栈对后缀表达式完成计算

程序员文章站 2022-05-26 12:08:00
...

虽然这个问题很简单...但确实困扰了我很久,感谢王道:D

 

利用栈实现中缀表达式转后缀表达式,再利用栈对后缀表达式完成计算

利用栈实现中缀表达式转后缀表达式,再利用栈对后缀表达式完成计算

 

代码如下:

#include <bits/stdc++.h>

using namespace std;
const int MAX=10005;
typedef struct node{
    bool flag;
    int data;
    char op;
}node;
typedef struct {
   int top;
   char buf[MAX];
}opStack;

typedef struct {
   int top;
   int buf[MAX];
}calcStack;
opStack stk1;
calcStack stk2;
char s[MAX];     //中缀表达式
node c[MAX];     //后缀表达式

int calc(int a,int b,char op){
    switch(op){
        case '+':return a+b;
        case '-':return a-b;
        case '*':return a*b;
        case '/':return a/b;
    }
    return -1;
}

bool check(char c){
    return c=='+'||c=='-'||c=='*'||c=='/';
}

bool compare(char a,char b){
    if(a=='+'||a=='-')
        return true;
    if(b=='*'||b=='/')
        return true;
    return false;

}

int main()
{
    scanf("%s",s);

    int index=0;
    bool flag=false;
    int temp=0;
    for(int i=0;s[i]!=0;i++){                   //中缀转后缀
        if(s[i]>='0'&&s[i]<='9'){
            flag=true;
            temp=temp*10+s[i]-'0';
        }else{
            if(flag){
                node cur;
                cur.flag=true;
                cur.data=temp;
                c[index++]=cur;
                temp=0;
                flag=false;
            }
            if(s[i]=='(')
                stk1.buf[stk1.top++]=s[i];
            else if(s[i]==')'){
                while(stk1.top>=1&&stk1.buf[stk1.top-1]!='('){
                    node cur;
                    cur.flag=false;
                    cur.op=stk1.buf[--stk1.top];
                    c[index++]=cur;
                }
                stk1.top--;
            }else{
                while(stk1.top>=1&&check(stk1.buf[stk1.top-1])&&compare(s[i],stk1.buf[stk1.top-1])){
                    node cur;
                    cur.flag=false;
                    cur.op=stk1.buf[--stk1.top];
                    c[index++]=cur;
                }
                stk1.buf[stk1.top++]=s[i];
            }
        }
    }
    if(flag){
        node cur;
        cur.flag=true;
        cur.data=temp;
        c[index++]=cur;
        temp=0;
        flag=false;
    }
    while(stk1.top>=1){
        node cur;
        cur.flag=false;
        cur.op=stk1.buf[--stk1.top];
        c[index++]=cur;
    }

    for(int i=0;i<index;i++){              //后缀计算
        if(c[i].flag){
            stk2.buf[stk2.top++]=c[i].data;
        }else{
            int right=stk2.buf[--stk2.top];
            int left=stk2.buf[--stk2.top];
            stk2.buf[stk2.top++]=calc(left,right,c[i].op);
        }
    }

    printf("%d\n",stk2.buf[stk2.top-1]);

    return 0;
}

利用栈实现中缀表达式转后缀表达式,再利用栈对后缀表达式完成计算

利用栈实现中缀表达式转后缀表达式,再利用栈对后缀表达式完成计算

 

再附上大一写的SB代码:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define N 10000000
typedef struct{
  int sum;
  int indexX;
  int indexY;
}node;
static char ans[N];
static int numX[N];
static char opeX[N];
static int topxX;
static int topyX;

int judge(char *ope,int y)
{
    if(y>1)
    {
        int ans1=0,ans2=0;
        if(ope[y-1]=='+'||ope[y-1]=='-')
            ans1=1;
        if(ope[y-1]=='*'||ope[y-1]=='/')
            ans1=2;
        if(ope[y-2]=='+'||ope[y-2]=='-')
            ans2=1;
        if(ope[y-2]=='*'||ope[y-2]=='/')
            ans2=2;
        if(ans1==ans2)
            return 1;
        else
            return ans1>ans2;
    }

    if(y<=0)
        return 0;

    return 1;
}

int sum(int a,int b,int x)
{
    int count;

    switch(x)
    {
        case '+':count=a+b; break;
        case '-':count=b-a; break;
        case '*':count=b*a; break;
        case '/':count=b/a; break;
    }

    return count;
}

int check(char* ope,int y)
{
    int ans1,ans2;

    if(y>1)
    {
        if(ope[y-1]=='*'&&ope[y-2]=='*')
            return 1;
        else
            return 0;
    }

    if(y==1)
        return 1;
    return 0;
}

node caculate(int *num,char *ope,int indexX,int indexY)
{
    node res;

    res.indexX=indexX-2;
    res.indexY=indexY-1;
    res.sum=sum(num[indexX-1],num[indexX-2],ope[indexY-1]);
    num[indexX-2]=res.sum;
    while(check(ope,indexY-1))
    {
        indexY--;
        indexX--;
        res.sum=sum(num[indexX-1],num[indexX-2],ope[indexY-1]);
        num[indexX-2]=res.sum;
        res.indexX=indexX-2;
        res.indexY=indexY-1;
    }

    return res;
}

int compute(int *num,char *ope,int topx,int topy)
{
    int count;

    while(topx>1)
    {
        if(judge(ope,topy))
        {
            int a=num[--topx];
            int b=num[topx-1];
            count=sum(a,b,ope[topy-1]);
            topy--;
            num[topx-1]=count;
        }
        else
        {
            node fuck=caculate(num,ope,topx-1,topy-1);
            int a=num[topx-1];
            num[fuck.indexX]=sum(a,fuck.sum,ope[topy-1]);
            topx=fuck.indexX+1;
            topy=fuck.indexY;
        }
    }

    return num[topx-1];
}

void transe()
{
    int i;
    int n=strlen(ans);
    int temp=0;
    int f=0;
    int x[N];                                      //多括号解决方法,在'('起始调用calculate函数,返回node,直到')'为止,遇到'('继续调用
    char opt[N];
    int maxx=0;
    int maxy=0;
    int flag=0;

    for(i=0;i<n;i++)
    {
        if((ans[i]>='0'&&ans[i]<='9')||ans[i]=='+'||ans[i]=='/'||ans[i]=='*'||ans[i]=='-'||ans[i]==')'||ans[i]=='(')
        {
            if(ans[i]>='0'&&ans[i]<='9')
            {
                if(temp==0)
                    temp=ans[i]-'0';
                else
                    temp=temp*10+ans[i]-'0';
                if(i==n-1||ans[i+1]<'0'||ans[i+1]>'9')
                {
                    if(f==1)
                    {
                        numX[topxX++]=1/temp;
                        f=0;
                        if(flag)
                            x[maxx++]=1/temp;
                    }
                    else
                        if(f==2)
                        {
                            numX[topxX++]=-temp;
                            f=0;
                            if(flag)
                                x[maxx++]=-temp;
                        }
                    else
                    {
                        numX[topxX++]=temp;
                        if(flag)
                            x[maxx++]=temp;
                    }

                    temp=0;
                }
            }
            else
            {
                if(ans[i]=='(')
                    flag=1;
                else
                    if(ans[i]==')')
                    {
                        flag=0;
                        double change=compute(x,opt,maxx,maxy);
                        numX[topxX-maxx]=change;
                        topxX=topxX-maxx+1;
                        topyX-=maxy;
                        maxx=0;
                        maxy=0;
                    }
                 else
                    if(ans[i]=='/')
                    {
                        f=1;
                        opeX[topyX++]='*';
                        if(flag)
                            opt[maxy++]='*';
                    }
                else
                    if(ans[i]=='-')
                    {
                        f=2;
                        opeX[topyX++]='+';
                        if(flag)
                           opt[maxy++]='+';
                    }
                else
                {
                    opeX[topyX++]=ans[i];
                    if(flag)
                        opt[maxy++]=ans[i];
                }

            }
        }
    }
}

void test()
{

    gets(ans);
    transe();
    printf("%d\n",compute(numX,opeX,topxX,topyX));
}

int main()
{
    test();

    return 0;
}

 

相关标签: 算法