实验6 栈的使用简易计算器

mac2024-05-07  34

#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(); } }
最新回复(0)