#include<iostream>
#include<iomanip>
using namespace std;
template<class T>
class List1
{
private:
T *a1; //定义一个数组
int size; //有多少个元素
int a1size; //数组的大小
public:
List1();
~List1();
T top(); //返回栈顶的值
void push(T); //入栈
void pop(); //删除栈顶元素
bool empty(); //是否为空
};
//构造
template<class T>
List1<T>::List1()
{
a1 = new T[1000];
size = 0;
a1size = 1000;
}
//析构
template<class T>
List1<T>::~List1()
{
delete [] a1;
}
//返回栈顶
template<class T>
T List1<T>::top()
{
return a1[size-1];
}
//是否为空
template<class T>
bool List1<T>::empty()
{
return size==0;
}
//删除栈顶
template<class T>
void List1<T>::pop()
{
size--;
}
//压栈
template<class T>
void List1<T>::push(T b)
{
if (size>=(a1size))
{
T *a2 = new T [2 * a1size];
for (int i = 0; i < size; i++)
{
a2[i] = a1[i];
}
delete [] a1;
a1 = a2;
a1size = 2 * a1size;
}
else {
a1[size] = b;
// cout<<"函数中a1="<<a1[size];
size++;
}
}
int pro(char const x) //比较优先级
{
switch (x){
case '-':{
return 0;
break;
}
case '+':{
return 0;
break;
}
case '/':{
return 1;
break;
}
case '*':{
return 1;
break;
}
default:{
return -1;
break;
}
}
}
//判断
template<class T>
void compare(List1<T> &a1,List1<T> &a2,char ch)
{
//cout<<ch<<endl;
if(ch=='+'||ch=='-'||ch=='*'||ch=='/'||ch=='('||ch==')') //判断是否为符号
{
if(ch =='(')
{
a2.push(ch);
// cout<<" 把"<<ch<<" 压入a2"<<endl;
return;
}
if(ch ==')')
{
while(a2.top()!='(')
{a1.push( a2.top());
// cout<<" 把a2 "<<a2.top()<<" 压入a1"<<endl;
a2.pop();}
if(a2.top()=='(')
{
a2.pop();
// cout<<"左右括号抵消"<<endl;
return;
}
}
if(!a2.empty()) //如果符号栈不空,就比较优先级
{
if(pro(ch)<=pro(a2.top()))
{
a1.push(a2.top());
// cout<<"把a2的顶 "<<a2.top() <<" 压入a1"<<endl;
a2.pop();
compare(a1,a2,ch);
}
else
{
a2.push(ch);
// cout<<" 把"<<ch<<" 压入a2"<<endl;
return;
}
}
else
{a2.push(ch);
// cout<<" 把"<<ch<<" 压入a2"<<endl; return;
}
}
if(ch>=48&&ch<=57)
{
a1.push(ch);
// cout<<" 把"<<ch<<" 压入a1"<<endl; return;
}
}
void fun()
{
List1<char> a1,a2;
string a;
cin>>a;
for(int i=0;i<a.length();i++)
{
compare(a1,a2,a[i]);
}
while(!a2.empty())
{
a1.push(a2.top());
// cout<<" 把a2 "<<a2.top()<<" 压入a1"<<endl;
a2.pop();
}
List1<double> a3;
//将a1倒入a2
while(!a1.empty())
{
a2.push(a1.top());
a1.pop();
}
//开始计算
while(!a2.empty())
{
// cout<<"****"<<endl;
if(a2.top()>=48&&a2.top()<=57)
{
// cout<<"a2="<<a2.top()<<endl;
double c = (double)a2.top()-48.00;
// cout<<"c="<<c<<endl;
a3.push(c);
// cout<<"a3="<<a3.top()<<endl;
a2.pop() ;
}
else
{
double num;
double num1 = a3.top();
a3.pop() ;
double num2 = a3.top();
a3.pop();
char aa = a2.top() ;
switch (aa)
{
case '+':{
num = num1+num2;
a3.push(num) ;
// cout<<num2<<"+"<<num1<<"="<<a3.top() <<endl;
a2.pop() ;
break;
}
case '-':{
num = num2-num1;
a3.push(num);
// cout<<num2<<"-"<<num1<<"="<<a3.top() <<endl;
a2.pop();
break;
}
case '*':{
num = num1*num2;
a3.push(num);
// cout<<num2<<"*"<<num1<<"="<<a3.top() <<endl;
a2.pop() ;
break;
}
case '/':{
num = num2/num1;
a3.push(num);
// cout<<num2<<"/"<<num1<<"="<<a3.top() <<endl;
a2.pop() ;
break;
}
}
}
}
cout<<setiosflags(ios::fixed)<<setprecision(2)<<a3.top()<<endl;
}
int main()
{
int a;
cin>>a;
for(int i=0;i<a;i++)
{fun(); }
}
实验6 栈的使用 简易计算器
最新推荐文章于 2021-11-14 08:35:52 发布