1. 程式人生 > 其它 >演算法與資料結構實驗二 棧的應用

演算法與資料結構實驗二 棧的應用

實驗專案名稱:實驗 棧的應用          

一、 實驗目的
1.掌握棧的定義及實現
2.掌握利用棧求解算術表示式。

二、 實驗內容

7-2 棧實現表示式求值

使用鍵盤輸入數學表示式(含數字,四種運算子+、-、、/和小括號,其中運算數都是一位數(0~9)),將數學表示式轉化成字尾表示式輸出,利用字尾表示式求表示式的值並輸出。

輸入格式:

輸入正確的表示式(可以有空格)後回車,得到字尾表示式和結果。輸入括號缺失的表示式,輸出"ERROR:缺少括號"。輸入兩個除括號外運算子連續的表示式,輸出"ERROR:表示式缺運算元"。

輸出格式:

請在這裡描述輸出格式。例如:對每一組輸入,在一行中輸出A+B的值。

輸入樣例:

在這裡給出一組輸入。例如:

5*(8-(3+2))

輸出樣例:

在這裡給出相應的輸出。例如:

5832+-*

15

三、 設計文件

 

四、 源程式

#include<iostream>

#include<cstdio>

#include<string>

using namespace std;

const int N=100010;

string split(string s){

    string ss;

    for(int i=0;i<s.size();i++){

        if(s[i]==32) continue;

        ss+=char(s[i]);

    }

    return ss;

}

 

bool ck1(string s){

    int cnt=0;

    for(int i=0;i<s.size();i++){

        if(s[i]=='(') cnt++;

        else if(s[i]==')') cnt--;

    }

    return  cnt==0;

}

 

bool ck2(string s){

    for(int i=0;i<s.size();i++){

        if(s[i]=='+'||s[i]=='-'||s[i]=='*'||s[i]=='/'){

            if(i==0||i==s.size()-1||i&&(s[i-1]=='+'||s[i-1]=='-'||s[i-1]=='*'||s[i-1]=='/')){

                return 0;

            }

        }

    }

    return 1;

}

 

int pri(char ch){return ch=='*'||ch=='/'?2:1;}

char ch[N];

int cnt;

string cg(string s){

    string ss;

    for(int i=0;i<s.size();i++){

        if(s[i]>='0'&&s[i]<='9'){

            ss+=char(s[i]);

        }else{

            if(s[i]=='('){

                ch[cnt++]='(';

            }else if(s[i]==')'){

                while(ch[cnt-1]!='('){

                    ss+=ch[--cnt];

                }

                cnt--;

            }else{

                char c=char(s[i]);

                if(cnt>0&&pri(c)<=pri(ch[cnt-1])){

                    while(cnt>0&&ch[cnt-1]!='('&&pri(c)<=pri(ch[cnt-1])){

                        ss+=ch[--cnt];

                    }

                }

                ch[cnt++]=c;

            }

        }

    }

    while(cnt>0){

        ss+=ch[--cnt];

    }

    return ss;

}

 

int op(int x,int y,char ch){

    if(ch=='+') return x+y;

    else if(ch=='-') return x-y;

    else if(ch=='*') return x*y;

    else return x/y;

}

int a[N],ct;

int op(string s){

    for(int i=0;i<s.size();i++){

        if(s[i]>='0'&&s[i]<='9'){

            a[ct++]=s[i]-48;

        }

        else{

            int x=a[ct-2],y=a[ct-1];

            ct-=2;

            a[ct++]=op(x,y,char(s[i]));

        }

    }

    return a[0];

}

 

int main(){

    string s;

    getline(cin,s);

     

    s=split(s);

 

    if(!ck1(s)){

        cout<<"ERROR:缺少括號";

        return 0;

    }

     

    if(!ck2(s)){

        cout<<"ERROR:表示式缺運算元";

        return 0;

    }

     

    string ss=cg(s);

    cout<<ss<<endl;

     

    cout<<op(ss);

     

    return 0;

}