表达式的计算(正确)

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] == '\0')    break;//遇到零就结束
      if(str[0] != '0' && str[1] == '\0')    {printf("%d\n", str[0]); continue;}
       //只有你一个数那么就输出
      while (str[i] != '\0') {
          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\n", gettop1(s));
}

    return 0;
}

 

posted @ 2015-11-25 13:49  别笑  阅读(376)  评论(0编辑  收藏  举报