#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
#define MAXSIZE 10
typedef struct CharStack
{
int top;
int data[MAXSIZE];
}*CharStackPtr;
//初始化
CharStackPtr initStack()
{
CharStackPtr newPtr = (CharStackPtr)malloc(sizeof(struct CharStack));
newPtr->top = -1;
return newPtr;
}
//判断是否为空
int isEmpty(CharStackPtr newStack)
{
if(newStack->top == -1)
return 0;
else
return 1;
}
//判断是否为满栈
int isFull(CharStackPtr newStack)
{
if(newStack->top >= MAXSIZE-1)
return 1;
else
return 0;
}
//获取栈顶元素
int getTop(CharStackPtr newStack)
{
if(newStack->top == -1)
return 0;
else
return newStack->data [newStack->top];
}
//输出
void outputStack(CharStackPtr newStack)
{
int i;
for(;i<=newStack->top;i++)
{
printf("%c ",newStack->data[i]);
}
printf("\r\n");
}
//进栈
void push(CharStackPtr newStack,int newData)
{
//判断栈满
if(isFull(newStack))
{
printf("The stack is full.\n");
return ;
}
newStack->top++;
newStack->data[newStack->top] = newData;
}
//出栈
int pop(CharStackPtr newStack,int e)
{
//判断栈空
if(!isEmpty(newStack))
{
printf("The stack is empty.\n");
return ;
}
newStack->top--;
e = newStack->data[newStack->top+1];
return ;//返回删除的元素
}
//判断是否为运算符号
int In(char c)
{
if(c == '+'||c == '-'||c == '/'||c =='*'||c == '('||c == ')'||c == '=')
return 1;
else
return 0;
}
//计算
int Operate(int a,char theta,int b)
{
switch(theta)
{
case '+':return a+b;
case '-':return a-b;
case '*':return a*b;
case '/':if(b!=0)
return a/b;
else
{
printf("Divisor can not be zero!\n");
return 0;
}
}
}
//判断优先级
char Precede(char theta1,char theta2)
{
int i,j;
char pre[][7]={// + - * / ( ) =
{'>','>','<','<','<','>','>'},
{'>','>','<','<','<','>','>'},
{'>','>','>','>','<','>','>'},
{'>','>','>','>','<','>','>'},
{'<','<','<','<','<','=','0'},
{'>','>','>','>','0','>','>'},
{'<','<','<','<','<','0','='}};
switch(theta1)
{
case '+': i=0; break;
case '-': i=1; break;
case '*': i=2; break;
case '/': i=3; break;
case '(': i=4; break;
case ')': i=5; break;
case '=': i=6; break;
}
switch(theta2)
{
case '+': j=0; break;
case '-': j=1; break;
case '*': j=2; break;
case '/': j=3; break;
case '(': j=4; break;
case ')': j=5; break;
case '=': j=6; break;
}
return(pre[i][j]);
}
int evaluateExpression(char *exp)
{
CharStackPtr OPND = initStack();//运算数栈
CharStackPtr OPTR = initStack();//运算符栈
int a,b,theta,x1,x2,x,i = 0;
char ch;
push(OPTR,'=');
ch = exp[i++];
while(ch!='='||getTop(OPTR)!='=')
{
if(In(ch))
{
switch(Precede(getTop(OPTR),ch))
{
case '<':
push(OPTR,ch);
ch = exp[i++];
break;
case '>':
pop(OPTR,theta);
pop(OPND,b);
pop(OPND,a);
push(OPND,Operate(a,theta,b));
break;
case '=':
pop(OPTR,x);
ch = exp[i++];
break;
}
}
else if(ch <= 9&&ch >= 0)
{
x1 = ch-'0';
push(OPND,x1);
x2 = x1;
ch = exp[i++];
while(ch <= 9&&ch >= 0)
{
x1 = ch -'0';
x2 = 10*x2+x1;
pop(OPND,x);
push(OPND,x2);
ch = exp[i++];
}
}
else if(ch==' ')
{
while(ch == ' ')
{
ch =exp[i++];
}
}
else
{
printf("Input has illegal characters!\n");
exit(0);
}
}
return (getTop(OPND));
}
int main()
{
char exp[150];
int result;
printf("please input:\n");
gets(exp);
result = evaluateExpression(exp);
printf("\n%s%d\n",exp,result);
return 0;
}
总结:代码规范非常重要,要不然别人有可能看不懂,同时要学会加注释