2015-10-14 69 views
1

被问到的问题是评估RPN表达式,并将=作为序列的终止字符,以便程序运行RPN并计算给出的表达式。所以我遇到一些麻烦是理解我应该如何将字符转换为整数,如指令特别指出的那样使用scanf(“%c”,& ch),它将输入作为字符而不是整数。如何将我的角色转换为整数,以便我可以将它们推送到数组并相应地对它们执行操作?逆向波兰语表示法疑难解答C

// 
// input: 1 2 3 * + = 
// output: 7 
// 

#include <stdio.h> 
#include <stdlib.h> 
int collection[100]; 
int top; 

void push(double v){ 
    if (top>99) 
    { 
     printf ("Stack Overflow\n"); 
     exit(0); 
    } 
    collection[++top]=v; 
} 
double pop(){ 
    double v; 
    if(top < 0) 
    { 
     printf("stack underflow\n"); 
     exit(0); 
    } 
    v=collection[--top]; 
    return v; 

} 

int main(void){ 
    char ch; 
    double a,b,c,sum; 
    int i; 
    top=-1; 

    printf("Enter an RPN expression: "); 
    while(ch!='='){ 
     scanf("%c", &ch); 
     i=0; 
     c=1; 
     push(ch); 
     if(collection[i]=='+'){ 
      a=pop(); 
      b=pop(); 
      c=b+a; 
      push(c); 
     } 
     else if(collection[i]=='-'){ 
      a=pop(); 
      b=pop(); 
      c=b-a; 
      push(c); 
     } 
     else if(collection[i]=='*'){ 
      a=pop(); 
      b=pop(); 
      c=b*a; 
      push(c); 
     } 
     else if(collection[i]=='/'){ 
      a=pop(); 
      b=pop(); 
      c=b/a; 
      push(c); 
     } 
     else{ 
      while(collection[i]!=0){ 
       i++; 
      } 
      i=i-1; 
      sum=0; 
      while(i>=0){ 
       sum=sum+((collection[i]-48)*c); 
       c=c*10; 
       i--; 
      } 
      push(sum); 
     } 
    } 
    printf("%lf\n",c); 
} 
+1

标题和代码都与问题无关。如果您需要帮助将字符转换为整数,请在标题中说明。顺便说它是波兰语,而不是“极地”。 –

+0

当您推入堆栈(或附加到数组)时,首先访问数组,然后递增:'arr [n ++]'。当你弹出堆栈时,你减少fisrt,然后访问数组。 'ARR [ - n]的'。这是因为'n'是数组之外的索引。你有前错误的。 –

+0

请注意''printf(“%lf \ n”,c);''其中'c'属于'char'类型会导致不快乐; '%lf'转换规范需要一个'double'参数,而不是'int'(这是'char'值将被提升到的类型)。 –

回答

0

如果满意unsigned int类型的数字:

char ch; 
scanf("%c", &ch); 
ch -= '0'; 

然后你就可以撰写数字中的数字乘以10并添加下一位数字。

0
使用

double atof(const char *nptr);

atof()的函数转换字符串的初始部分指出 由nptrdouble。尽管你的计算机命令编程结构很糟糕。使用单独的功能为每个任务的算法,以避免并发症

这里是(一些)我RPN计算器:

#include <stdio.h> 
#include <stdlib.h> 
#include <math.h> 
#include "cal.h" 
#define MAXOP 100 

int main(){ 

    int type; 
    double op2,op3; 
    char s[MAXOP]; 

    while((type = getop(s)) != EOF){ 
     switch(type){ 
     case NUMBER: 
      push(atof(s)); 
      break; 
     case 'x': 
      op2 = pop(); 
      op3 = pop(); 
      push(op2); 
      push(op3); 
      break; 
     case 'o': 
      clear(); 
      break; 
     case 's': 
      push(sin(pop())); 
      break; 
     case '+': 
      push(pop() + pop()); 
      break; 
     case '*': 
      push(pop() * pop()); 
      break; 
     case '-': 
      op2 = pop(); 
      push(pop() - op2); 
      break; 
     case '/': 
      op2 = pop(); 
      push(pop()/op2); 
      break; 
     case '%': 
      op2 = pop(); 
      push((int)pop() % (int)op2); 
      break; 
     case '\n': 
      printf("\t%.4g\n",showtop()); 
      break; 
     default: 
      printf("What was that?\n"); 
      break; 
     } 
    } 

    return 0; 
} 
+0

大声笑“我的一些”反正真的dat!谢谢@Jonathan Leffler – 2015-10-14 06:40:08