C 中缀计算器
我正在写一个程序(这是家庭作业),用C语言用堆栈创建中缀计算器。我想出了以下逻辑:C 中缀计算器,c,stack,infix-notation,C,Stack,Infix Notation,我正在写一个程序(这是家庭作业),用C语言用堆栈创建中缀计算器。我想出了以下逻辑: 有两个堆栈:一个用于数字,一个用于运算符。 将输入存储为字符字符串,然后一次扫描一个字符,将每个元素推入其适当的堆栈中。 忽略打开的参数,在遇到关闭的参数时:从numstack中弹出两个数字,从opstack中弹出一个运算符,根据弹出的值进行计算,然后返回答案 示例:(1+(2*3))应给出7 但它不起作用。 我得到垃圾作为输出。 这是我的输出: enter string to be evaluated (100
(1+(2*3))
应给出7
但它不起作用。
我得到垃圾作为输出。
这是我的输出:enter string to be evaluated (100 chars max): (1+1)
string : (1+1)
Length : 5
reading : (
reading : 1 pushing : 1
reading : + pushing : 43
reading : 1 pushing : 1
reading : ) popping : 1 popping : 1 popping : 431 + 302 = 303
pushing : 303
我不明白为什么。帮点忙就好了
我的代码:
#include<stdio.h>
#include<conio.h> // i **have to** use turbo c.
#define LEN 25
void push(int *stack , int* top ,int item){
printf(" pushing : %d ", item);
stack[*top] = item;
(*top)++;
}
int pop(int *stack , int* top){
int temp;
(*top)--;
temp = stack[*top];
printf(" popping : %d",temp); // this causing a dilemma while popping character operators.
return temp;
}
void calc(int* numstack , int* numtop, int* opstack , int* optop){
int num1,num2,ans;
char sign;
num1 = pop(numstack,numtop);
num1 = pop(numstack,numtop);
switch(pop(opstack,optop)){
case '+' : ans = num1 + num2; sign = '+' ; break;
case '-' : ans = num1 - num2; sign = '-' ; break;
case '*' : ans = num1 * num2; sign = '*' ; break;
case '/' : ans = num1 / num2; sign = '/' ; break;
}
printf("%d %c %d = %d \n",num1,sign,num2,ans);
push(numstack,numtop,ans);
while(getchar()!='\n'){} // cleanup stdin from any junk
}
int main(void){
int optop = 0 , numtop = 0, i=0 , numstack[50] , opstack[30];
char str[102], c;
clrscr();
// read and trim input evaluatioon string
printf("enter string to be evaluated (100 chars max): ");
fgets(str , 100 , stdin);
while(str[i]!='\n'){ i++; }
str[i] = '\0';
printf("\nstring : %s \nLength : %d",str,i);
i = 0;
// evaluate
while( (c=str[i]) !='\0'){
printf("\n reading : %c ",str[i]);
if(c=='('){ i++; continue; } // ignore open parens
else if(c=='+'||c=='-'||c=='*'||c=='/') push(opstack,&optop,c);
else if(c>=48 && c <=57) push(numstack,&numtop,(c-48));
else if(c==')') calc(numstack , &numtop, opstack , &optop);
else printf("\n%c is invalid..\n",c);
i++;
}
printf("\nanswer is : %g",pop(numstack,&numtop));
getch(); // again , *must use* turbo c
return 0;
}
#包括
#包括//我**必须**使用turbo c。
#定义LEN 25
无效推送(int*堆栈、int*顶部、int项){
printf(“推送:%d”,项目);
堆栈[*顶部]=项目;
(*顶部)++;
}
int-pop(int*stack,int*top){
内部温度;
(*顶部)--;
温度=堆栈[*顶部];
printf(“弹出:%d”,temp);//这导致在弹出字符运算符时出现进退两难的情况。
返回温度;
}
无效计算(int*numstack,int*numtop,int*optstack,int*optop){
int num1,num2,ans;
字符符号;
num1=pop(numstack,numtop);
num1=pop(numstack,numtop);
开关(pop(opstack,optop)){
大小写“+”:ans=num1+num2;符号=“+”;中断;
案例'-':ans=num1-num2;符号='-';中断;
大小写“*”:ans=num1*num2;符号=“*”;中断;
大小写“/”:ans=num1/num2;符号=“/”;中断;
}
printf(“%d%c%d=%d\n”,num1,符号,num2,ans);
推送(numstack、numtop、ans);
而(getchar()!='\n'){}//则从任何垃圾中清除stdin
}
内部主(空){
int optop=0,numtop=0,i=0,numstack[50],opstack[30];
char-str[102],c;
clrsc();
//读取并修剪字符串上的输入求值
printf(“输入要计算的字符串(最多100个字符):”;
fgets(str,100,stdin);
while(str[i]!='\n'){i++;}
str[i]='\0';
printf(“\n字符串:%s\n长度:%d”,str,i);
i=0;
//评估
而((c=str[i])!='\0'){
printf(“\n读取:%c”,str[i]);
如果(c=='('){i++;continue;}//忽略打开的参数
else如果(c='+'| | c='-'| | c='*'| | c=='/')推送(opstack,&optop,c);
否则,如果(c>=48&&c这是您的问题:
num1 = pop(numstack,numtop);
num1 = pop(numstack,numtop);
您两次都分配给num1
,第一次应该是num2
您还需要将最终答案行更改为:
printf("\nanswer is : %d\n",pop(numstack,&numtop));
%g
代表双打,%d
代表整数。这是您的问题:
num1 = pop(numstack,numtop);
num1 = pop(numstack,numtop);
您两次都分配给num1
,第一次应该是num2
您还需要将最终答案行更改为:
printf("\nanswer is : %d\n",pop(numstack,&numtop));
%g
代表双打,%d
代表整数。这是您的问题:
num1 = pop(numstack,numtop);
num1 = pop(numstack,numtop);
您两次都分配给num1
,第一次应该是num2
您还需要将最终答案行更改为:
printf("\nanswer is : %d\n",pop(numstack,&numtop));
%g
代表双打,%d
代表整数。这是您的问题:
num1 = pop(numstack,numtop);
num1 = pop(numstack,numtop);
您两次都分配给num1
,第一次应该是num2
您还需要将最终答案行更改为:
printf("\nanswer is : %d\n",pop(numstack,&numtop));
%g
表示双精度,%d
表示整数。对不起。在我需要之前按下了post按钮。更新了查询。查找反向波兰符号-请参阅。有算法可以从中缀符号、硬编码48
和57
转换为它。请在我尝试编译时使用c>=“0”和&c<'9'
查看我得到的代码:calc.c:58:警告:格式“%g”要求类型为“double”,但参数2的类型为“int”,忽略打开的参数显然是错误的,因为1*(2+3)
和(1*2+3)
将以相同的方式进行解析。关于如何使用运算符堆栈和操作数堆栈解析表达式,有大量文献……您应该研究一下。请注意,您的示例(1+(2*3))
根本不需要parens,这是一个非常糟糕的例子。抱歉..在我需要之前按下了post按钮。更新了查询。查找反向波兰符号-请参阅。有算法可以从中缀符号转换为它。48
和57
。请使用c>='0'&&c<'9'
。当我尝试编译时ng我得到的代码:calc.c:58:警告:格式“%g”要求类型为“double”,但参数2的类型为“int”,忽略打开的参数显然是错误的,因为1*(2+3)
和(1*2+3)
将以相同的方式进行解析。关于如何使用运算符堆栈和操作数堆栈解析表达式,有大量文献……您应该研究一下。请注意,您的示例(1+(2*3))
根本不需要parens,这是一个非常糟糕的例子。抱歉..在我需要之前按下了post按钮。更新了查询。查找反向波兰符号-请参阅。有算法可以从中缀符号转换为它。48
和57
。请使用c>='0'&&c<'9'
。当我尝试编译时ng我得到的代码:calc.c:58:警告:格式“%g”要求类型为“double”,但参数2的类型为“int”,忽略打开的参数显然是错误的,因为1*(2+3)
和(1*2+3)
将以相同的方式进行解析。关于如何使用运算符堆栈和操作数堆栈解析表达式,有大量文献……您应该研究一下。请注意,您的示例(1+(2*3))
根本不需要parens,这是一个非常糟糕的例子。抱歉..在我需要之前按下了post按钮。更新了查询。查找反向波兰符号-请参阅。有算法可以从中缀符号转换为它。48
和57
。请使用c>='0'&&c<'9'
。当我尝试编译时ng我得到的代码:calc.c:58:警告:格式“%g”要求类型为“double”,但参数2的类型为“int”,忽略打开的参数显然是错误的,因为1*(2