#include
#include
#define MAX 20
//定义第一个栈---作为存放运算数的操作符
struct SNode_Num
{
int datas[MAX];
int top;
};
typedef struct SNode_Num OperateNum;
//定义第二个栈---作为存放运算符号的栈
struct SNode_Symbol
{
char symbol[MAX];
int top;
};
typedef struct SNode_Symbol OperateSymbol;
/********************************************************************
描述:定义函数:InitOperandNum,并且初始化运算数栈顶
参数:OperateNum *StackNum
返回值:void
********************************************************************/
void InitOperateNum(OperateNum *StackNum)
{
StackNum->top = -1;
}
/********************************************************************
描述:定义函数: InitOperateSymbol,并且初始化运算符栈顶
参数:OperateSymbol *StackSymbol
返回值:void
********************************************************************/
void InitOperateSymbol(OperateSymbol *StackSymbol)
{
StackSymbol->top = -1;
}
/********************************************************************
描述:定义函数:PushOperateNum, 压一个数到栈顶
参数:OperateNum *StackNum, int x
返回值:void
********************************************************************/
void PushOperateNum(OperateNum *StackNum, int x)
{
StackNum->top++;
StackNum->datas[StackNum->top] = x;
}
/********************************************************************
描述:定义函数:PushOperateSymbol,压一个运算符到栈顶
参数:OperateSymbol *StackSymbol, char ch
返回值:void
********************************************************************/
void PushOperateSymbol(OperateSymbol *StackSymbol, char ch)
{
StackSymbol->top++;
StackSymbol->symbol[StackSymbol->top] = ch;
}
/********************************************************************
描述:定义函数:PopOperateNum,将运算数从栈中读取出来
参数:OperateNum *StackNum
返回值:返回取出来的数
********************************************************************/
int PopOperateNum(OperateNum *StackNum)
{
int num;
num = StackNum->datas[StackNum->top];
StackNum->top--;
return num;
}
/********************************************************************
描述:定义函数:PopOperateSymbol,将运算符从栈中取出来
参数:OperateSymbol *StackSymbol
返回值:返回取出来的符号
********************************************************************/
char PopOperateSymbol(OperateSymbol *StackSymbol)
{
char ch;
ch = StackSymbol->symbol[StackSymbol->top];
StackSymbol->top--;
return ch;
}
//取出相应的数
int GetOperateNum(OperateNum *StackNum)
{
return StackNum->datas[StackNum->top];
}
//取出相应运算符
char GetOperateSymbol(OperateSymbol *StackSymbol)
{
return StackSymbol->symbol[StackSymbol->top];
}
/********************************************************************
描述:定义函数, IsOperateSymbolOrNum,判断输入的符号是那些符号
参数:char ch
返回值:有符号返回1,无符号返回0
********************************************************************/
short IsOperateSymbolOrNum(char ch)
{
//判断所有需要用的操作符 包括 + - * / ( ) \n
if(ch == '+' || ch == '-' || ch == '*'
|| ch == '/' || ch == '(' || ch == ')' || ch == '\n') return 1;
else return 0;
}
/********************************************************************
描述:定义函数: Priority,用于判断符号优先级运算
参数:char inputnum, char ch
返回值:符号的大小的字符
********************************************************************/
char Priority(char inputnum, char ch)
{
switch(inputnum)
{
//加减在同一个优先级上
case '+':
case '-':
{
if(ch == '+' || ch == '-') return '>';
else if(ch == '*' || ch == '/') return '';
}
break;
//乘除在同一优先级
case '*':
case '/':
{
if(ch == '+' || ch == '-') return '>';
else if(ch == '*' || ch == '/') return '>';
else if(ch == '(') return '';
else return '>';
}
break;
//括号在所有优先级以上
case '(':
{
if(ch == ')') return '=';
else return '';
}
break;
case '\n':
{
if(ch == '\n') return '=';
else return ' |