加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

C++实现计算四则运算式支持括号(原创)

(2012-05-16 22:32:03)
标签:

c语言

cpp

四则运算

支持括号

计算

教育

分类: 计算机科学
//不是利用数据结构---栈
//两个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;

}

0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有