/**/
///
///表达式计算
////数据结构:栈
////作者:ZZJ_4Ever
///
#include < iostream >
#include < stack >
#include < string >
#include < assert.h >
using namespace std;
stack < double > data_stack;
stack < char > char_stack;
int PRI( char & ch)
... {
if(ch==')')...{return 1;}
else if(ch=='+'||ch=='-')...{return 2;}
else if(ch=='*'||ch=='/')...{return 3;}
else return 0;
}
/**/ /*
2.扫描到操作符,与操作符栈的顶端操作符进行比较,
如果优先级小或相等,则弹出数据和操作符进行计算,将结果送入数据栈;
如果优先级较大,则进操作符栈;
如果是’(‘直接进栈,如果是’)’,遇到’(‘则抵消.
*/
void Exc_stack()
... {
double result_temp;
assert(char_stack.size()>=1&&data_stack.size()>=1);
double temp1=data_stack.top();
data_stack.pop();
double temp2=data_stack.top();
data_stack.pop();
char popchar=char_stack.top();
char_stack.pop();
if(popchar=='+')
result_temp=temp2+temp1;
else if(popchar=='-')
result_temp=temp2-temp1;
else if(popchar=='*')
result_temp=temp2*temp1;
else if(popchar=='/')
result_temp=temp2/temp1;
data_stack.push(result_temp);
}
void push_charinto( char & ch)
... {
if(ch=='(')//如果是’(‘直接进栈
char_stack.push(ch);
else if(char_stack.empty())
...{
char_stack.push(ch);
}
else if(PRI(ch)>PRI(char_stack.top()))//如果优先级较大,则进操作符栈
...{
char_stack.push(ch);
}
//扫描到操作符
else//如果优先级小或相等,则弹出数据和操作符进行计算,将结果送入数据栈
...{
Exc_stack();
if(ch==')')//如果是’)’,遇’(‘直接弹出.
...{
while(char_stack.top()!='(')//操作括号内的内容直到遇到'('为止
...{
Exc_stack();
}
char_stack.pop();
}
else
//将自己压入栈
char_stack.push(ch);
}
}
void push_datainto( double & db)
... {
data_stack.push(db);
}
void main()
... {
string str;
while(1)
...{
bool flag=false;
double ret = 0.0;
double n ;
cout<<"在此输入表达式:";
//读 入
cin>>str;
//处理
//筛选
/**/
/////开始扫描
///
for(int i=0;i<str.length();i++)
...{
if(str[i]>='0' && str[i]<='9')
...{
if(!flag)
ret = ret *10 + str[i]-'0';
else
...{
ret = ret + (str[i]-'0')/n;
n*=10;
}
}
else if(str[i] == '.')
...{
n = 10;
flag = true;
}
else
...{
if(ret!=0 || str[i-1]=='0')
push_datainto(ret);
ret=0.0;
flag = false;
push_charinto(str[i]);
}
}
//如果最后一个数字还没有压入栈
if(ret!=0||str[i-1]=='0')push_datainto(ret);
//3.扫描数据完成后,依次退栈并进行计算
assert(!data_stack.empty()||!char_stack.empty());
while(data_stack.size()!=1)
...{
Exc_stack();
}
// double rre=data_stack.top();
cout<<"结果:"<<data_stack.top()<<endl;
data_stack.pop();
}
}
///表达式计算
////数据结构:栈
////作者:ZZJ_4Ever
///
#include < iostream >
#include < stack >
#include < string >
#include < assert.h >
using namespace std;
stack < double > data_stack;
stack < char > char_stack;
int PRI( char & ch)
... {
if(ch==')')...{return 1;}
else if(ch=='+'||ch=='-')...{return 2;}
else if(ch=='*'||ch=='/')...{return 3;}
else return 0;
}
/**/ /*
2.扫描到操作符,与操作符栈的顶端操作符进行比较,
如果优先级小或相等,则弹出数据和操作符进行计算,将结果送入数据栈;
如果优先级较大,则进操作符栈;
如果是’(‘直接进栈,如果是’)’,遇到’(‘则抵消.
*/
void Exc_stack()
... {
double result_temp;
assert(char_stack.size()>=1&&data_stack.size()>=1);
double temp1=data_stack.top();
data_stack.pop();
double temp2=data_stack.top();
data_stack.pop();
char popchar=char_stack.top();
char_stack.pop();
if(popchar=='+')
result_temp=temp2+temp1;
else if(popchar=='-')
result_temp=temp2-temp1;
else if(popchar=='*')
result_temp=temp2*temp1;
else if(popchar=='/')
result_temp=temp2/temp1;
data_stack.push(result_temp);
}
void push_charinto( char & ch)
... {
if(ch=='(')//如果是’(‘直接进栈
char_stack.push(ch);
else if(char_stack.empty())
...{
char_stack.push(ch);
}
else if(PRI(ch)>PRI(char_stack.top()))//如果优先级较大,则进操作符栈
...{
char_stack.push(ch);
}
//扫描到操作符
else//如果优先级小或相等,则弹出数据和操作符进行计算,将结果送入数据栈
...{
Exc_stack();
if(ch==')')//如果是’)’,遇’(‘直接弹出.
...{
while(char_stack.top()!='(')//操作括号内的内容直到遇到'('为止
...{
Exc_stack();
}
char_stack.pop();
}
else
//将自己压入栈
char_stack.push(ch);
}
}
void push_datainto( double & db)
... {
data_stack.push(db);
}
void main()
... {
string str;
while(1)
...{
bool flag=false;
double ret = 0.0;
double n ;
cout<<"在此输入表达式:";
//读 入
cin>>str;
//处理
//筛选
/**/
/////开始扫描
///
for(int i=0;i<str.length();i++)
...{
if(str[i]>='0' && str[i]<='9')
...{
if(!flag)
ret = ret *10 + str[i]-'0';
else
...{
ret = ret + (str[i]-'0')/n;
n*=10;
}
}
else if(str[i] == '.')
...{
n = 10;
flag = true;
}
else
...{
if(ret!=0 || str[i-1]=='0')
push_datainto(ret);
ret=0.0;
flag = false;
push_charinto(str[i]);
}
}
//如果最后一个数字还没有压入栈
if(ret!=0||str[i-1]=='0')push_datainto(ret);
//3.扫描数据完成后,依次退栈并进行计算
assert(!data_stack.empty()||!char_stack.empty());
while(data_stack.size()!=1)
...{
Exc_stack();
}
// double rre=data_stack.top();
cout<<"结果:"<<data_stack.top()<<endl;
data_stack.pop();
}
}