C language: stack exercise-postfix evaluation
#include <stdio.h>
#define MAXSIZE 100
typedef struct Stack{
double value[MAXSIZE];
int top;
}Stack;
void Init_Stack(Stack *S);
void Push_data(Stack *S, double d);
double if_data(Stack *S,char input[]);
double Calculate(Stack *S,double left,double right,char c);
int main()
{
Stack S;
double result;
char input[100];
while (1)
{
char flag = 0;
Init_Stack(&S);
printf("请输入后缀式:\n");
gets(input);
result = if_data(&S,input);
printf("=%.2lf\n",result);
printf("是否继续输入'y'or''n:");
e:scanf("%c",&flag);
fflush(stdin);
if (flag == 'n' || flag == 'y')
{
if (flag == 'n')
{
printf("运行结束!\n");
break;
}
}
else
{
printf("输入有误,请输入'y'or'n':");
goto e;
}
fflush(stdin);
}
return 0;
}
void Init_Stack(Stack *S)
{
S->top = -1;
}
void Push_data(Stack *S, double d)
{
S->top++;
S->value[S->top] = d;
}
double Calculate(Stack *S, double left, double right, char c)
{
double equal = 0;
switch (c)
{
case '+':
equal = left + right;
break;
case '-':
equal = left - right;
break;
case '*':
equal = left * right;
break;
case '/':
equal = left / right;
break;
default:
break;
}
S->top--;
S->value[S->top]=equal;
return equal;
}
double if_data(Stack *S,char input[])
{
int i = 0;
double n = 0;
double temp = 0;
for(i=0;input[i]!='\0';i++)
{
if (input[i]<='9' && input[i]>='0')
{
temp = input[i]-'0';
while (input[i+1]!='\0')
{
if (input[i+1]<='9' && input[i+1]>='0')
{
temp = temp*10 + (input[i+1]-'0');
i++;
}
else
break;
}
Push_data(S,temp);
}
else if (input[i]=='+' || input[i]=='-' || input[i]=='*' || input[i]=='/' )
{
n=Calculate(S,S->value[S->top-1],S->value[S->top],input[i]);
}
}
return n;
}