这是任意表达式求解的实现,只限于四则运算。
//
//表达式求解所使用栈的实现部分
//
//
#ifndef _STACK_H
#define _STACK_H
#include<iostream>
using namespace std;
#define INIT_STACK_SIZE 20
#define ElemType int
typedef struct
{
ElemType *base;
int capacity;
int top;
}Stack;
void InitStack(Stack *st);
void Push(Stack *st, ElemType x);
void ShowStack(Stack *st);
void Pop(Stack *st);
void Pop(Stack *st,ElemType *v);
ElemType GetTop(Stack *st);
void ClearStack(Stack *st);
bool IsFull(Stack *st)
{
return st->top >= st->capacity;
}
bool IsEmpty(Stack *st)
{
return st->top == 0;
}
void InitStack(Stack *st)
{
st->base = (ElemType *)malloc(sizeof(ElemType) * INIT_STACK_SIZE);
st->capacity = INIT_STACK_SIZE;
st->top = 0;
}
void Push(Stack *st, ElemType x)
{
if(!IsFull(st))
{
st->base[st->top++] = x;
}
else
{
cout<<"栈满,不能入栈!"<<endl;
}
}
void ShowStack(Stack *st)
{
for(int i=st->top-1; i>=0; --i)
{
cout<<st->base[i]<<endl;
}
}
void Pop(Stack *st)
{
if(!IsEmpty(st))
{
st->top--;
}
else
{
cout<<"栈空,不能出栈!"<<endl;
}
}
void Pop(Stack *st,ElemType *v)
{
if(!IsEmpty(st))
{
*v = st->base[--st->top];
}
else
{
cout<<"栈空,不能出栈!"<<endl;
}
}
ElemType GetTop(Stack *st)
{
if(!IsEmpty(st))
{
return st->base[st->top-1];
}
else
{
cout<<"栈空,不能获取栈顶元素!"<<endl;
return -1;
}
}
void ClearStack(Stack *st)
{
st->top = 0;
}
#endif
//
//
// 表达式求解实现部分
//
//
#include<iostream>
#include"../Test12_30DS/Stack/Stack.h" //是我的栈实现的头文件,可以根据自己的实际情况来改写
using namespace std;
#include<string.h>
bool IsOper(char ch) //判断是否是符号
{
if(ch=='[' || ch=='(' || ch=='+' || ch=='-'
||ch=='*' || ch== '/' || ch==']' || ch==')' || ch=='#')
return true;
else
return false;
}
//内 外
char Compare(char in, char out) // 比较栈顶的符号和站外的优先级大小
{
if(in == '+' || in == '-')
{
if(out=='+' || out=='-' || out==')' || out=='#')
return '>';
else
return '<';
}
else if(in == '*' || in == '/')
{
if(out == '(')
return '<';
else
return '>';
}
else if(in == '(')
{
if(out == ')')
return '=';
else
return '<';
}
else if(in == ')')
{
return '>';
}
else
{
if(out == '#')
return '=';
else
return '<';
}
}
// 左值 操作符 右值
int Evaluate(int a,int op,int b) //进行两数的运算
{
if(op == '+')
return a+b;
else if(op == '-')
return a-b;
else if(op == '*')
return a*b;
else
return a/b;
}
int EvaluateExpression(char *exp)
{
Stack OPO,OPD;
int a,b;
int op;
InitStack(&OPO);
InitStack(&OPD);
Push(&OPO,'#');
while(*exp!='#' || GetTop(&OPO)!='#')
{
if(IsOper(*exp))
{
switch(Compare(GetTop(&OPO), *exp))
{
case '>':
Pop(&OPD,&b);
Pop(&OPD,&a);
Pop(&OPO,&op);
Push(&OPD,Evaluate(a,op,b));
break;
case '<':
Push(&OPO,*exp);
exp++;
break;
case '=':
Pop(&OPO);
exp++;
break;
default:
break;
}
}
else
{
int s=0;
while(!IsOper(*exp)) //将数字符转化成数字
{
s=s*10+*exp-'0';
exp++;
}
Push(&OPD,s); //数字符入栈
}
}
return GetTop(&OPD); // 最后的结果
}
void main()
{
char exp[30];
cout<<"请输入表达式:> ";
cin>>exp;
strcat(exp,"#");
int result = EvaluateExpression(exp);
cout<<"表达式结果为:> "<<result<<endl;
}