Крат, вычисленное выражение неверно из-за push((int)exp[i])
. Это преобразует символ в его ASCII-эквивалент, что неверно. Пожалуйста, измените ваш код на `push (exp [i] - '0'), который преобразует символ в его эквивалентное число.
Например: 1 '- 49 (значение ASCII). Следовательно, оно будет оценено как 49 - 48 (ASCII из '0') = 1
Примечание. Написанный код не поддерживает числа> 9. Вы можете сделать это следующим образом.
- Рассматривать каждый символ как операнд и читать его значение перед нажатием.
Выражение: ab * c + (здесь a, b, c - операнды. Если символ не является оператором, считайте его операндом)
Вы можете использовать следующую реализацию с номерами> 9 также
#include<stdio.h>
#include<string.h>
char exp[20];
int stck[15];
int tos=-1;
int isEmpty()
{
if(tos==-1)
return 1;
return 0;
}
int isFull()
{
if(tos==9)
return 1;
return 0;
}
int pop()
{
if(!(isEmpty()))
return stck[tos--];
else
printf("Underflow\n");
}
void push(int c)
{
if(!(isFull()))
stck[++tos]=c;
else
printf("Overflow\n");
}
int isOperator(char c)
{
if(c=='+' || c=='-' || c=='/' || c=='%' || c=='*' )
return 1;
return 0;
}
void main()
{
int i,a,b,c, operand;
printf("Enter the expression: ");
gets(exp);
for(i=0;exp[i]!='\0';i++)
{
//printf("Current symbol is %c\n",exp[i]);
if(!(isOperator(exp[i])))
{
printf("Enter '%c' value:", exp[i]);
scanf("%d", &operand);
push(operand);
printf("Pushed %d into the stack\n",stck[tos]);
}
else
{
b=pop();
a=pop();
printf("Value of a and b are : %d and %d \n",a,b);
if(exp[i]=='+')
c=a+b;
if(exp[i]=='-')
c=a-b;
if(exp[i]=='*')
c=a*b;
if(exp[i]=='/')
c=a/b;
if(exp[i]=='%')
c=a%b;
push(c);
printf("C pushed. top of stack is now %d\n",stck[tos]);
}
}
printf("The value of expression is: %d\n",pop());
getchar();
}