#include<stdlib.h>
#include<stdio.h>
#define M 100
typedef struct
{
char character[M];//运算符
int top;
}Stack;
typedef struct
{
int character[M];//运算数字
int top;
}nStack;
void InitStack(Stack *S)
{
//S = (Stack*)malloc(sizeof(Stack));
S->top = -1;
}
void InitStackn (nStack *S)
{
//S = (nStack*)malloc(sizeof(Stack));
S->top = -1;
}
int Push(Stack *OPTR,char ch)
{
if(OPTR->top == M - 1)
{
printf("栈满了!");
return 0;
}
OPTR->top++;
OPTR->character[OPTR->top] = ch;
return 1;
}
int Pushn(nStack *OPTR,int x)
{
if(OPTR->top == M - 1)
{
printf("栈满了!");
return 0;
}
OPTR->top++;
OPTR->character[OPTR->top] = x;
return 1;
}
int Pop(Stack *OPTR,char *op)
{
if(OPTR->top == -1)
{
printf("运算符栈空了!");
return 0;
}
*op = OPTR->character[OPTR->top];
OPTR->top--;
return 1;
}
int Popn(nStack *OPTR,int *op)
{
if(OPTR->top == -1)
{
printf("数字栈空了!");
return 0;
}
*op = OPTR->character[OPTR->top];
OPTR->top--;
return 1;
}
char GetTop(Stack OPTR)
{
if(OPTR.top == -1)
{
printf("运算符栈为空的!\n");
return 0;
}
return OPTR.character[OPTR.top];
}
int GetTopn(nStack OPTR)
{
if(OPTR.top == -1)
{
printf("数字栈为空的!\n");
return 0;
}
return OPTR.character[OPTR.top];
}
//判断C是否为操作符
bool In(char ch)
{
switch(ch)
{
case '+':
case '-':
case '*':
case '/':
case '#':
return true;
break;
default:
return false;
}
}
/*或者定义一个数组
char ops[5]={'+','-','*','/','#'};
int In(char ch) /*判断输入字符是否为运算符函数,是返回TRUE,不是返回FALSE
{
int i;
for (i=0;i<5;i++)
{
if(ch==ops[i])
return 0;
}
return 1;
}
*/
char Compare(char ch1,char ch2)
{
char f;
switch(ch2)
{
case '+':
case '-':if(ch1=='#')
f='>'; //进栈
else
f='<'; //出栈
break;
case '*':
case '/':if(ch1=='*'||ch1=='/')
f='<';
else
f='>';
break;
case '#':if(ch1 == '#')
f = '=';
else
f = '<';
break;
}
return f;
}
int Execute(int a,char op,int b)
{
int c;
switch(op)
{
case '+':
c = a + b;
break;
case '-':
c = a - b;
break;
case '*':
c = a*b;
break;
case '/':
c = a/b;
break;
}
return c;
}
int ExpEvluation()
{
int v,temp;
char *str;
char ch;
int a,b;
char op;
int i = 0;
Stack OVS;//运算符栈
nStack OPTR;//运算数栈
//初始化两个栈
InitStack(&OVS);
InitStackn(&OPTR);
Push(&OVS,'#'); //为了运算方便先在符号栈里面压入“#”
printf("请输入一个表达式(以'#'结束):\n");
str = (char *)malloc(100*sizeof(char));
gets(str);
ch = str[i];
i++;
while(ch != '#'||GetTop(OVS) != '#')//当读入的字符和栈顶的字符均为‘#’时结束运算
{
//判断是否为运算符,选择出运算数字
if(!In(ch))//刚读入的不是运算符是运算数
{
temp = ch - '0'; /*将字符转换为十进制数*/
ch = str[i];
i++;
Pushn(&OPTR,temp);
}
else
{
switch(Compare(GetTop(OVS),ch)) //比较栈顶元素和刚读入运算符的优先级
{
case '>':
Push(&OVS,ch);
ch = str[i];
i++;
break;
case '= ':
Pop(&OVS,&op);
ch = str[i];
break;
case '<':
Pop(&OVS,&op);
Popn(&OPTR,&b);
Popn(&OPTR,&a);
v = Execute(a,op,b);
Pushn(&OPTR,v);
break;
}
}
}
v = GetTopn(OPTR);
return (v);
}
int main()
{
int a;
a = ExpEvluation();
printf("%d",a);
printf("\n");
return 0;
}