• 表达式的计算(正确)


    1.表达式的计算
    
    主要考察栈的一些运用
    
    先加减,后乘除,有括号先算,无需多讲;
    
     
    
    ------------------------------------------------------------------------------------------------------
    
    遇到数字入(收集数据)push_data,
    
     
    
    (与运算符先比较优先级高入栈,低的话出栈运算并把数据入栈--
    
     
    
    直到遇到比他高一级的运算符或者elem已空)最后push_elem,;;;
    
     
    
    遇到‘(’入elem;   ')'那就将括号里面的运算
    
    把剩下的做运算结果存入整型数组的第一个
    
    -----------------------------------------------------------------------------------------------------
    
    #include <cstdio>
    #include <cstdlib>
    //#define _OJ_
    //#define maxsize 100
    
    typedef struct stack1
    {
        char *elem;
        int  *data;
        int top;    int top1;
        int base;   int base1;
    } stack1, *stack;
    
    stack
    creat_stack(void)
    {
        stack s;
        s = (stack) malloc (sizeof(stack1));
        s->elem = (char*) malloc (100 * sizeof(char));
        s->data = (int*)  malloc  (100 * sizeof(int));
        s->top = s->base = 0;
        s->top1 = s->base1 = 0;
        return s;
    }
    
    int
    data_pop(stack s)
    {
        return s->data[--s->top];
    }
    
    char
    elem_pop(stack s)
    {
        return s->elem[--s->top1];
    }
    
    void
    push_data(stack s, int x)
    {
        s->data[s->top++] = x;
    }
    
    void
    push_elem(stack s, char ch)
    {
        s->elem[s->top1++] = ch;
    }
    
    int
    data_isempty(stack s)
    {
        if(s->top == s->base)
            return 1;
        else
            return 0;
    }
    
    int
    elem_isempty(stack s)
    {
        if(s->top1 == s->base1)
            return 1;
        else
            return 0;
    }
    
    char
    gettop(stack s)
    {
        return s->elem[s->top1 - 1];
    }
    
    int
    gettop1(stack s)
    {
        return s->data[s->top - 1];
    }
    
    int
    operater(int a, char op, int b)
    {
        switch (op) {
        case '+':  return a + b;
        case '-':  return a - b;
        case '*':  return a * b;
        case '/':  return a / b;
        }
    }
    
    int
    get_rank(char op)
    {
        switch (op) {
        case '+':
        case '-':  return 1;
        case '*':
        case '/':  return 2;
        case '(':  return 3;
        }
    
    }
    
    //建立一个字符数组和整型数组分别记录
    int main(int argc, char const *argv[]) {
    #ifndef _OJ_  //ONLINE_JUDGE
        freopen("input.txt", "r", stdin);
    #endif
    
        char ch1;
        int data2, data1, data, rank1, rank2, n ,i = 0;
        char str[100];
        stack s;
        while(scanf("%s", str) != EOF){
            i = 0;
            s = creat_stack();
          if(str[0] == '0' && str[1] == '')    break;//遇到零就结束
          if(str[0] != '0' && str[1] == '')    {printf("%d
    ", str[0]); continue;}
           //只有你一个数那么就输出
          while (str[i] != '') {
              data = 0;
    
          if ('0' <= str[i] && str[i] <= '9') {
            while('0' <= str[i] && str[i] <= '9') {
                data = data * 10 + str[i] - '0';
                i++;
          }
          push_data(s,data);//收集数据传入整型数组
          continue;
      }
    
          else if(str[i] == '(')
            push_elem(s,str[i]);
          else if(str[i] == ')')  {//遇右括号就把里面的数计算入栈
               while (gettop(s) != '(')  {
               data1 = data_pop(s);    data2 = data_pop(s);
               ch1   = elem_pop(s);
                n = operater(data2,ch1,data1);
                push_data(s,n);
            }
               elem_pop(s);
        }
    
         else{
            if(elem_isempty(s))    push_elem(s,str[i]);//先判断栈是否为空空的就入栈
            else {
                ch1 = gettop(s);    rank1 = get_rank(ch1);
                rank2 = get_rank(str[i]);
                while ((ch1 != '(') && (rank2 <= rank1) && elem_isempty(s) != 1) {
                 ch1 = gettop(s);
                 if(ch1 == '(') break;//注意不可和(作比较
    
                 data1 = data_pop(s);    data2 = data_pop(s);
                 ch1 = elem_pop(s);
                 n = operater(data2,ch1,data1);
                 push_data(s,n);
                }//把优先级别高的和相等的计算入栈
                push_elem(s,str[i]);
        }
    }
    
               i++;
    }
    //把剩下的做运算结果存入整型数组的第一个
       while (!elem_isempty(s)) {
        //printf("good!!");
          data1 = data_pop(s);    data2 = data_pop(s);
          ch1   = elem_pop(s);
          n = operater(data2,ch1,data1);
          push_data(s,n);
        }
    
    printf("%d
    ", gettop1(s));
    }
    
        return 0;
    }
    
  • 相关阅读:
    nodejs websocket
    [Java] 数组-01 入门
    [Java] 第一,二章 配置, 基础
    [Java] 第四章 异常机制
    [Java] 第三章 面向对象总结
    [Java] 接口-02
    [Java] 接口-01
    [Java] final 关键字
    [Java] 抽象类
    [Java] 多态-01
  • 原文地址:https://www.cnblogs.com/airfand/p/4994448.html
Copyright © 2020-2023  润新知