#include <iostream>
#define MAXSIZE 100
using namespace std;
//****************
char Positive = '+';
char Negative = '+';
//****************
typedef struct DOPND
{
//栈
int Arr[MAXSIZE]; //先改为数字栈
//栈顶指针和栈底指针
int End,Top;
}OPND;
typedef struct ROPTR
{
//栈
char Arr[MAXSIZE];
//栈顶指针和栈底指针
int End,Top;
}OPTR;
//初始化栈
template <class Type>
void Init(Type& sta)
{
sta.Top = 0;
sta.End = 0;
}
//入栈
template <class Type,class Value>
void Push(Type& sta,Value val)
{cout<<val<<endl;
sta.Top = sta.Top + 1;
sta.Arr[sta.Top] = val;
}
//出栈
template <class Type,class Val>
void Pop(Type& sta, Val& val)
{
if(isEmpty(sta))return;
val = sta.Arr[sta.Top];
sta.Top = sta.Top - 1;
}
//取栈顶元素
template <class Type,class Val>
Val GetTop(Type& sta,Val val)
{
if(!isEmpty(sta))
return sta.Arr[sta.Top];
return (Val)val;
}
template <class Type>
bool isEmpty(Type& sta)
{
if(0 == sta.Top)return true;
return false;
}
//判断ch是不是运算符
bool IsOperator(char ch, char OP[])
{
for(int i = 0; i < strlen(OP); i++)
{
if(ch == OP[i])
{
//ch是运算法返回真
return true;
}
}
//是操作数
return false;
}
//判断运算符栈顶元素和读入运算符的优先关系
char Precede(char Sta_operator,char Input_perator)
{
char cSearchTab[7][7] = {'>','>','<','<','<','>','>',
'>','>','<','<','<','>','>',
'>','>','>','>','<','>','>',
'>','>','>','>','<','>','>',
'<','<','<','<','<','=','0',
'>','>','>','>','0','>','>',
'<','<','<','<','<','0','='};
char cArr[7] = {'+','-','*','/','(',')','='};
int x = -1,y = -1;
for(int i = 0; i < 7; i++)
{
if(Sta_operator == cArr[i])
x = i;
if(Input_perator == cArr[i])
y = i;
}
return cSearchTab[x][y];
}
//根据操作符计算两个操作数的值
int Operate(int First_Number, char Operator, int Second_Number)
{
// int iA = First_Number - '0';
// int iB = Second_Number - '0';
int iRes = 0;
switch(Operator)
{
case '+':
iRes = First_Number + Second_Number;
break;
case '-':
iRes = First_Number - Second_Number;
break;
case '*':
iRes = First_Number * Second_Number;
break;
case '/':
iRes = First_Number / Second_Number;
break;
}
return iRes;
}
//将新读入的字符与操作数栈顶元素拼接
void Conn(OPND& Operand,char ch,bool flag)
{
if(Operand.Top > 0 && false == flag)
{
//如果flag == false 说明要进行连接
int Pre;
Pop(Operand,Pre);
char str1[50];
_itoa(Pre,str1,10);//先获取栈顶元素的字符串的形式
int len = strlen(str1);
str1[strlen(str1)] = ch;
str1[len + 2] = '\0';
// cout<<" :"<<Pre<<" "<<str1<<endl;
Push(Operand,atoi(str1));
}
else
{
Push(Operand,ch - '0');
}
}
int main()
{
char OP[] = {'+','-',
'*','/',
'(',')',
'='};
//cout<<Operate('1','+','7')<<endl;
char ch;
bool flag = false;
//操作数
OPND Operand;
//操作符
OPTR Operator;
//初始化
Init(Operand);cin>>ch;
Init(Operator);Push(Operator,'=');
while(ch != '=' || GetTop(Operator,'0') != '=')
{
//如果输入的不是'=' 并且栈顶元素也不是'='
if(!IsOperator(ch,OP))
{
//如果不是操作符,则连接Operand栈顶元素,并进栈
Conn(Operand,ch,flag);
cin>>ch;
flag = false;
}
else
{
//这块要判断正负数的情况
//正负数为两种情况 -2+(-3)
// +2-(+3)
if(ch == '-' || ch == '+')
{
//如果操作数栈为空 或者 操作符栈顶元素为'(',表示接下来的一个数为正负数
if(isEmpty(Operand) || '(' == GetTop(Operator,'0'))
{
Push(Operand,0);//直接把0入栈,然后继续 -2 相当于0-2
}
}
flag = true; //操作符下一必为操作数
switch(Precede(GetTop(Operator,'0'),ch))
{
case '<':
Push(Operator,ch);
cin>>ch;
break;
case '>':
{
int a,b;
char Ope;
//取操作符
Pop(Operator,Ope);
//取操作数
Pop(Operand,a);
Pop(Operand,b);
//计算
Push(Operand,Operate(b,Ope,a));
}
break;
case '=':
{
char x;
Pop(Operator,x);
cin>>ch;
}
break;
}
}
}
int Res = GetTop(Operand,49);
cout<<"结果得: "<<Res<<endl;
cout<<-0+5<<endl;
return 0;
}
表达式求值(多位)
最新推荐文章于 2020-07-04 20:56:44 发布