栈的应用 - 简单计算器

A

E - 简单计算器
Crawling in process... Crawling failed Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u

Description

读入一个只包含 +, -, *, / 的非负整数计算表达式,计算该表达式的值。
 

Input

测试输入包含若干测试用例,每个测试用例占一行,每行不超过200个字符,整数和运算符之间用一个空格分隔。没有非法表达式。当一行中只有0时输入结束,相应的结果不要输出。
 

Output

对每个测试用例输出1行,即该表达式的值,精确到小数点后2位。
 

Sample Input

     
     
1 + 2 4 + 2 * 5 - 7 / 11 0
 

Sample Output

     
     
3.00 13.36
最应该注意的问题,简单的说是栈的转移
#include<stdio.h> #include<stack> #include<algorithm> #include<string.h> #include<stdlib.h> using namespace std;
int main(){
 char  b[220];     char a [220][220];  while(gets(b)){       memset(a,0,sizeof(a));   if(strcmp(b,"0")==0)break;   stack<double> snum;   stack<char>schar;   stack<char>cchar;   stack<double>cnum;   int z = 0;   int x = 0;   int length = strlen(b);   //printf("长度是%d\n",length);///   for(int i=0;i<length;i++){    if(b[i] != ' '){     a[z][x++] = b[i];    }    else {        z++;        x = 0;           }   }   //for(int i=0;i<=z;i++){   // printf("%s\n",a[i]);///   //}       x = 0;   int y = 0;   char fuhao[210];   double num[220];   for(int i=0;i<=z;i++){
   if(a[i][0]>='0'&&a[i][0]<='9'){     double xx = (double)atoi(a[i]);                 num[x++] = xx;    }    else      fuhao[y++] = a[i][0];       }     // for(int i=0;i<x;i++)   //printf("%f ",num[i]);   //printf("\n");   //for(int i=0;i<y;i++)   //printf("%c ",fuhao[i]);   //printf("\n");   int numers = x;   int chars = y;   x = y = 0;   double ss;   snum.push(num[x++]);   for(int i=0;i<chars;i++){    if(fuhao[i]=='*'){     ss = num[x++] * snum.top();     snum.pop();        snum.push(ss);    }    else if(fuhao[i] == '/'){       ss = snum.top() / num[x++];               snum.pop();               snum.push(ss);    }    else {     snum.push(num[x++]);     schar.push(fuhao[i]);    }   }   while(!snum.empty()){    cnum.push(snum.top());    snum.pop();   }   while(!schar.empty()){    cchar.push(schar.top());    schar.pop();   }         double s1 = cnum.top();         double s2 = 0;         char v;         cnum.pop();         while(!cnum.empty()){          s2 = cnum.top();          cnum.pop();          v = cchar.top();          cchar.pop();          if(v == '+')s1 = s1 + s2;          else s1 = s1 - s2;         }         printf("%.2f\n",s1);   /*for(int i=0;i<=z;i++){    for(int j=0;j<strlen(a[i]);j++){     printf("%c",a[i][j]);    }    printf("\n");   }*/  }   }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: C语言带括号的简易计算器可以通过使用和逆波兰表达式来实现。逆波兰表达式是一种将操作符放在操作数之后的表示法,可以方便地用堆计算求解。 首先,我们需要定义堆数据结构和相应的操作函数。可以使用数组来表示堆,并定义一个指针变量top来指示当前顶的位置。操作函数包括入(push)、出(pop)、判断堆是否为空(isEmpty)和获取顶元素(topValue)。 接下来,我们可以定义一个函数用于将中缀表达式转换为逆波兰表达式。这个函数可以使用一个字符数组作为中间存储区,通过遍历输入的中缀表达式,遇到数字则直接输出,遇到操作符则根据优先级判断是否需要将之前存储的操作符出,并将当前操作符入。此外,还需要考虑括号的处理,遇到左括号直接入,遇到右括号则将顶元素出,直到遇到左括号为止。 最后,我们还需要定义一个函数用于计算逆波兰表达式。该函数同样使用来完成计算过程。当遇到数字时,将其入;当遇到操作符时,从中出两个操作数进行计算,并将结果入;最后,当整个逆波兰表达式遍历完后,顶的元素即为最终计算结果。 通过以上步骤,我们就可以实现一个带括号的简易计算器。用户只需输入一个中缀表达式,程序将会输出计算结果。在实际应用中,我们还可以对用户的输入进行合法性校验,例如判断是否存在不匹配的括号、除数是否为0等问题。 ### 回答2: C语言带括号的简易计算器是一个能够处理带有括号的数学表达式的程序。通过使用C语言的基本语法和运算符,我们可以实现一个简单的计算器来解析和计算这些表达式。 首先,我们需要定义几个变量来存储输入和计算结果。我们可以使用字符数组来存储用户输入的表达式,并使用整型变量来存储计算结果。 接下来,我们需要编写一个函数来处理表达式。该函数将使用循环来逐个解析表达式中的字符,并根据运算符的优先级和括号的位置来执行相应的计算。我们可以使用来存储运算符和操作数,以便在必要时进行后续计算。 当我们遇到左括号时,我们将把括号内的表达式作为一个新的子表达式,并通过递归调用函数来求解它。当我们遇到右括号时,我们将从中弹出运算符和操作数,并进行相应的计算。然后将结果放回中,以便后续计算使用。 同时,在遍历表达式的过程中,我们还需要处理数字和运算符。当我们遇到数字时,我们将其转换为整数,并将其压入中。当我们遇到运算符时,我们将根据优先级进行相应的计算,并将结果压入中。 最后,我们将在主函数中读取用户输入的表达式,并调用上述函数来计算结果。然后将计算结果打印出来,即得到了一个带括号的简易计算器。 总之,通过结合C语言的基本语法和运算符,我们可以编写一个简单的计算器来处理带有括号的数学表达式。这个计算器能够准确地解析和计算表达式,并给出正确的结果。 ### 回答3: C语言带括号的简易计算器可以通过利用数据结构来实现。下面是一个使用C语言来实现的简单示例代码: ```c #include <stdio.h> #include <stdlib.h> #define MAX_SIZE 100 // 定义结构 typedef struct { int data[MAX_SIZE]; int top; } Stack; void init(Stack *s) { s->top = -1; } int isEmpty(Stack *s) { return s->top == -1; } void push(Stack *s, int num) { if (s->top == MAX_SIZE - 1) { printf("已满,无法继续入\n"); exit(1); } s->data[++(s->top)] = num; } int pop(Stack *s) { if (isEmpty(s)) { printf("为空,无法进行出操作\n"); exit(1); } return s->data[(s->top)--]; } int calculate(int a, int b, char op) { switch(op) { case '+': return a + b; case '-': return a - b; case '*': return a * b; case '/': return a / b; default: printf("无效的运算符\n"); exit(1); } } int evaluateExpression(char *expression) { Stack numStack; Stack operatorStack; init(&numStack); init(&operatorStack); int i = 0; while (expression[i] != '\0') { if (expression[i] >= '0' && expression[i] <= '9') { int num = 0; while (expression[i] >= '0' && expression[i] <= '9') { num = num * 10 + (expression[i] - '0'); i++; } push(&numStack, num); } else if (expression[i] == '(') { push(&operatorStack, '('); i++; } else if (expression[i] == ')') { while (!isEmpty(&operatorStack) && operatorStack.data[operatorStack.top] != '(') { int b = pop(&numStack); int a = pop(&numStack); char op = (char)pop(&operatorStack); push(&numStack, calculate(a, b, op)); } // 弹出'(' pop(&operatorStack); i++; } else if (expression[i] == '+' || expression[i] == '-' || expression[i] == '*' || expression[i] == '/') { while (!isEmpty(&operatorStack) && operatorStack.data[operatorStack.top] != '(') { int b = pop(&numStack); int a = pop(&numStack); char op = (char)pop(&operatorStack); push(&numStack, calculate(a, b, op)); } push(&operatorStack, (int)expression[i]); i++; } else { printf("无效的字符\n"); exit(1); } } while (!isEmpty(&operatorStack)) { int b = pop(&numStack); int a = pop(&numStack); char op = (char)pop(&operatorStack); push(&numStack, calculate(a, b, op)); } return numStack.data[numStack.top]; } int main() { char expression[] = "(1+2)*(3-4)+5/2"; int result = evaluateExpression(expression); printf("计算结果为:%d\n", result); return 0; } ``` 上述代码中的`evaluateExpression`函数用于计算带有括号的表达式的值。计算过程中,将操作数压入一个数中,将运算符压入一个操作符中,并根据运算符的优先级进行相应的计算,并将计算结果压入数中。最终,数中的最后一个数即为表达式的计算结果。 上述代码给出了一个示例的带括号的表达式`(1+2)*(3-4)+5/2`的计算结果为`-3`。可以根据需要修改表达式来进行计算。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值