C++实现计算四则运算式支持括号(原创)
(2012-05-16 22:32:03)
标签:
c语言cpp四则运算支持括号计算教育 |
分类: 计算机科学 |
//不是利用数据结构---栈
//两个vector一个保存符号,另一个保存数字
#include <iostream>
//两个vector一个保存符号,另一个保存数字
#include <iostream>
#include <string>
#include <stdio.h>
#include <stdlib.h>
#include <vector>
using namespace std;
class rec{
public:
rec(int pos=0,char sign='+',int pri=0){
this->pos=pos;
this->sign=sign;
this->pri=pri;
}
int pos;
char sign;
int pri;
};
int main()
{
string sp;
int kuohaoNum=0;
int spLength;
vector<rec> recs;
vector<int> reci;
while(true){
recs.clear();
reci.clear();
cout << "请输入长度小于30四则运算式,+_*/计入长度" << endl;
int signNum=0;
char* p=new char[100];
char* ptmp=p;
cin.getline(p,100);
sp=string(p);
rec rj;
printf("P:%x\n",p);
printf("SP:%x\n",&sp[0]);
spLength=sp.length();
int spNum=atoi(ptmp);
reci.push_back(spNum);
for(int i=0;i<spLength;i++){
if(*ptmp>='0'&&*ptmp<='9'){
ptmp++;
}
else{
switch(sp[i]){
case '(':kuohaoNum++;ptmp++; if(*ptmp>='0'&&*ptmp<='9'){spNum=atoi(ptmp);signNum++; reci.push_back(spNum);}break;
case ')':kuohaoNum--;ptmp++; if(*ptmp>='0'&&*ptmp<='9'){spNum=atoi(ptmp);signNum++; reci.push_back(spNum);}break;
case '+':rj.pos=signNum;rj.sign='+',rj.pri=0+2*kuohaoNum;recs.push_back(rj); ptmp++; if(*ptmp>='0'&&*ptmp<='9'){spNum=atoi(ptmp);signNum++; reci.push_back(spNum);}break;
case '-':rj.pos=signNum;rj.sign='-',rj.pri=0+2*kuohaoNum;recs.push_back(rj); ptmp++; if(*ptmp>='0'&&*ptmp<='9'){spNum=atoi(ptmp);signNum++; reci.push_back(spNum);}break;
case '*':rj.pos=signNum;rj.sign='*',rj.pri=1+2*kuohaoNum;recs.push_back(rj); ptmp++; if(*ptmp>='0'&&*ptmp<='9'){spNum=atoi(ptmp);signNum++; reci.push_back(spNum);}break;
case '/':rj.pos=signNum;rj.sign='/',rj.pri=1+2*kuohaoNum;recs.push_back(rj); ptmp++; if(*ptmp>='0'&&*ptmp<='9'){spNum=atoi(ptmp);signNum++; reci.push_back(spNum);}break;
}
}
}
vector<int>::iterator iter=reci.begin();
while(iter!=reci.end()){
cout<<*iter<<","<<endl;
++iter;
}
delete [] p;
p=NULL;
//记录位置 符号 优先级!
//下面的排序要改成插入排序
int max;
int min;
for(int i=0;i<recs.size();i++){
max=i;
for(int j=i+1;j<recs.size();j++)
{
if(recs[max].pri<recs[j].pri)
max=j;
}
if(i!=max){
rec temp=recs[i];
recs[i]=recs[max];
recs[max]=temp;
}
}
for(int i=0;i<recs.size();i++){
min=i;
if(recs[i].pri==0){
for(int j=i+1;j<recs.size();j++)
{
if(recs[min].pos>recs[j].pos)
min=j;
}
if(i!=max){
rec temp=recs[i];
recs[i]=recs[min];
recs[min]=temp;
}
}
}
for(int i=0;i<recs.size();i++){
rec rw=recs.at(i);
cout<<rw.pos<<","<<rw.sign<<","<<rw.pri<<endl;
}
//iter=reci.begin();
int i=0;
cout<<signNum<<endl;
while(signNum--){
switch(recs.at(i).sign){
case '+':reci[recs.at(i).pos]=reci.at(recs.at(i).pos)+reci.at(recs.at(i).pos+1);break;
case '-':reci[recs.at(i).pos]=reci.at(recs.at(i).pos)-reci.at(recs.at(i).pos+1);break;
case '*':reci[recs.at(i).pos]=reci.at(recs.at(i).pos)*reci.at(recs.at(i).pos+1);break;
case '/':reci[recs.at(i).pos]=reci.at(recs.at(i).pos)/reci.at(recs.at(i).pos+1);break;
}
for(int j=i+1;j<recs.size();j++){
if(recs.at(j).pos>recs.at(i).pos)
recs[j].pos--;
}
iter=reci.begin();
iter+=recs.at(i).pos+1;
reci.erase(iter,iter+1);
cout<<"------------"<<endl;
iter=reci.begin();
while(iter!=reci.end()){
cout<<*iter<<" ";
++iter;
}
//if(i<reci.size())
i++;
}
//cin.get();
}
return 0;
}

加载中…