故我


私信TA

用户名:uq_37592642929

访问量:2982

签 名:

一起去啊,更远方的地方!!!!

等  级
排  名 707
经  验 3908
参赛次数 0
文章发表 53
年  龄 0
在职情况 学生
学  校 社会大学
专  业

  自我简介:

解题思路:

注意事项:   //下列1代表数字栈操作      2代表符号栈操作

参考代码:

#include <stdio.h>

#include <string.h>

#include <stdlib.h>

struct s{

    int num[100];  //数字栈

    char ch[100];  //符号栈

    int top1;   //数字栈顶指针

    int top2;   //符号栈顶指针

};


void clear(struct s *stack){   //初始化栈

    stack->top1=-1;

    stack->top2=-1;

}

int pop1(struct s *stack){   //弹出数字元素

    int n;

    n=stack->num[stack->top1];

    stack->top1--;

    return n;

}

char pop2(struct s *stack){    //弹出符号元素

    char c;

    c=stack->ch[stack->top2];

    stack->top2--;

    return c;

}

void push1(struct s *stack,int n){   //压入数字元素

    stack->top1++;

    stack->num[stack->top1]=n;

}

void push2(struct s *stack,char c){    //压入符号元素

    stack->top2++;

    stack->ch[stack->top2]=c;

}

int compare(char c){     //比较符号优先级

    if (c=='+'||c=='-'){   //加减为1

        return 1;

    }else if (c=='*'||c=='/'){   //乘除为2

        return 2;

    }else{    //其他都为0,包括  左右括号都为0 ,()为0以便于不会对后面压入的符号产生影响

        return 0;

    }

}

int compute(int a,int b,char c){  //计算返回值

    int s;

    switch(c){

        case '+':s=a+b;break;

        case '-':s=a-b;break;

        case '*':s=a*b;break;

        case '/':s=a/b;break;

    }

    return s;

}

int main (){

    struct s *stack;

    stack=(struct s *)malloc(sizeof(struct s));  //用指针做的,先要创建一个空间

    int a=0;

    char c;

    char b[1000];

    int answer=0;

    int f=0;

    while (scanf ("%s",b)!=EOF){   //每一组表达式以字符串b输入

        clear(stack);  //每次初始化栈

        answer=0;

        for (int i=0;b[i]!='\0';i++){

            if (b[i]>='0'&&b[i]<='9'){  //将数字字符转化成数字a

                a=a*10+b[i]-'0';  

                f=1;

                continue;

            }else{

                c=b[i];  //c为计算符号

            }

            if (f==1){

                push1(stack,a);   //数字入栈

                f=0;

                a=0;

            }

            if (c=='#'){   //以c为分支对象,分别讨论

                break;

            }else if (c=='('){  //c为左括号直接入栈

                push2(stack,c);

            }else if (c==')'){     //c为右括号计算到左括号前面

                int s;

                char t;

                t=pop2(stack);

                while (t!='('){  //计算到左括号前面,即将括号里的算出来

                    s=compute(pop1(stack),pop1(stack),t);

                    push1(stack,s);

                    t=pop2(stack);

                }

            }else{

                if (compare(stack->ch[stack->top2])<compare(c)||stack->top2==-1){    //如果符号栈为空或者c的优先级高于符号栈栈顶的符号时,直接入栈即可

                    push2(stack,c);

                }else{    //c的优先级高于符号栈栈顶的符号时,需要将栈顶符号计算出来的,将结果入栈的(这里不好理解,不懂的可以自己推导一下,先加减再乘除嘛)

                    int s;

                    s=compute(pop1(stack),pop1(stack),pop2(stack));

                    push1(stack,s);

                    push2(stack,c);

                }

            }

        }

        while (1){      //最后算出结果输出即可

            if (stack->top2==-1){

                printf ("%d\n",answer);

                break;

            }

            answer=compute(pop1(stack),pop1(stack),pop2(stack));

            push1(stack,answer);

        }

    }

}


 

0.0分

2 人评分

  评论区

  • «
  • »