c++實現簡單計算器

  試着用c++寫了一個計算器,支持加減乘除和括號。c++

  我是分步完成的,先寫了一個簡單的不支持括號的,而後再改爲支持括號版。spa

 

一. 僅支持加減乘除

  用兩個手寫棧(不推薦stl的棧,由於棧不難寫,stl感受太慢),一個棧存儲符號,一個棧存儲已經讀入的數(無符號)。code

  掃一遍表達式,把符號和數字按次序存進兩個棧(注意,若是第一個數是正數,則第一個進棧的符號要是+號;若是是負數,則進棧一個-號,存儲數的棧則存進正數)。存儲符號的棧只須要存儲+和-就好了,若是讀到了*或\號,就直接乘除給棧頂的數,這樣能夠保證乘除的優先級。blog

  掃完了以後按順序算一遍棧就好了。遞歸

#include <cstdio>
#include <cstring>
using namespace std;
const int maxn=10000;

int n;
char ch[maxn+5];

int read_pos;    //read()讀入時最後一個字符的位置+1 
inline int read(int s){    //返回以ch[s]爲開頭的數 
    int ans=0;
    for (;(ch[s]>='0'&&ch[s]<='9');s++)
        ans=ans*10+ch[s]-'0';
    read_pos=s;
    return ans;
}

int solve(int l,int r){    //表達式l到r的值 
    int stack[2][maxn+5],len=0;    //手寫棧 
    if (ch[l]!='-')
        stack[0][++len]=1,stack[1][len]=read(l);
    else stack[0][++len]=-1,stack[1][len]=read(l+1);
    l=read_pos;
    int temp;
    while (l<=r){
        if (ch[l]=='+')
            stack[0][++len]=1,stack[1][len]=read(l+1);
        else if (ch[l]=='-')
            stack[0][++len]=-1,stack[1][len]=read(l+1);
        else if (ch[l]=='*')
            temp=read(l+1),stack[1][len]*=temp;
        else temp=read(l+1),stack[1][len]/=temp;
        l=read_pos;
    }
    int result=0;
    for (int i=1;i<=len;i++)    //處理掉棧中的數 
        result+=(stack[0][i]*stack[1][i]);
    return result;
}

int main(){
//    freopen("test2.in","r",stdin);
    scanf("%s",ch);
    int tt=strlen(ch);
    printf("%d",solve(0,tt-1));
    return 0;
}

 

二. 支持括號

  應該有不少種模擬方法,我是在預處理時存進每一對括號的位置,而後遞歸計算括號就好了(把括號當數來看)。string

#include <cstdio>
#include <cstring>
using namespace std;
const int maxn=10000;

int n;
char ch[maxn+5];
int to[maxn+5];

int que[maxn+5],size;

int read_pos;

int read(int s);

int solve(int l,int r){
    int stack[2][maxn+5],len=0;
    if (ch[l]!='-')
        stack[0][++len]=1,stack[1][len]=read(l);
    else stack[0][++len]=-1,stack[1][len]=read(l+1);
    l=read_pos;
    int temp;
    while (l<=r){
        if (ch[l]=='+')
            stack[0][++len]=1,stack[1][len]=read(l+1);
        else if (ch[l]=='-')
            stack[0][++len]=-1,stack[1][len]=read(l+1);
        else if (ch[l]=='*')
            temp=read(l+1),stack[1][len]*=temp;
        else    temp=read(l+1),stack[1][len]/=temp;
        l=read_pos;
    }
    int result=0;
    for (int i=1;i<=len;i++)
        result+=(stack[0][i]*stack[1][i]);
    return result;
}

int main(){
//    freopen("test2.in","r",stdin);
    scanf("%s",ch);
    int tt=strlen(ch);
    for (int i=0;i<tt;i++)
        if (ch[i]=='(')
            que[++size]=i;
        else if (ch[i]==')')
            to[que[size]]=i,size-=1;
    printf("%d",solve(0,tt-1));
    return 0;
}


inline int read(int s){
    int ans=0,f=1;
    if (ch[s]=='('){
        ans=solve(s+1,to[s]-1);
        read_pos=to[s]+1;
        return ans;
    }
    else if (ch[s]=='-') f=-1,s+=1;
    for (;(ch[s]>='0'&&ch[s]<='9');s++)
        ans=ans*10+ch[s]-'0';
    read_pos=s;
    return ans*f;
}
相關文章
相關標籤/搜索