C 中的反向波兰表示法疑难解答
Reverse Polish Notation Troubleshooting in C
要问的问题是评估 RPN 表达式,并让 = 成为序列的终止符,以便程序运行 RPN 并计算给定的表达式。所以我遇到的一些麻烦是理解我应该如何将我的字符转换为整数,因为说明特别说使用 scanf("%c", &ch) 它将输入作为字符而不是整数。我如何将我的字符转换为整数,以便我可以将它们推送到数组并对它们进行相应的操作?
//
// 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);
}
使用double atof(const char *nptr);
atof()
函数将指向的字符串的开头部分进行转换
从 nptr
到 double
。尽管您向计算器发出命令的编程结构很糟糕。为算法中的每个任务使用单独的函数以避免复杂化
这是我的(部分)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;
}
如果对 unsigned int 数字满意:
char ch;
scanf( "%c", &ch );
ch -= '0';
然后你可以通过乘以 10 并添加下一个数字来组成数字。
要问的问题是评估 RPN 表达式,并让 = 成为序列的终止符,以便程序运行 RPN 并计算给定的表达式。所以我遇到的一些麻烦是理解我应该如何将我的字符转换为整数,因为说明特别说使用 scanf("%c", &ch) 它将输入作为字符而不是整数。我如何将我的字符转换为整数,以便我可以将它们推送到数组并对它们进行相应的操作?
//
// 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);
}
使用double atof(const char *nptr);
atof()
函数将指向的字符串的开头部分进行转换
从 nptr
到 double
。尽管您向计算器发出命令的编程结构很糟糕。为算法中的每个任务使用单独的函数以避免复杂化
这是我的(部分)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;
}
如果对 unsigned int 数字满意:
char ch;
scanf( "%c", &ch );
ch -= '0';
然后你可以通过乘以 10 并添加下一个数字来组成数字。