簡單計算器(棧的應用)

Just Go For It Now發表於2018-09-05


   讀入一個只包含 +, -, *, / 的非負整數計算表示式,計算該表示式的值。

輸入描述:

    測試輸入包含若干測試用例,每個測試用例佔一行,每行不超過200個字元,整數和運算子之間用一個空格分隔。沒有非法表示式。當一行中只有0時輸入結束,相應的結果不要輸出。


 

輸出描述:

    對每個測試用例輸出1行,即該表示式的值,精確到小數點後2位。

 這個題目主要使用棧來寫,與此同時還要注意符號的優先順序,利用匯編語言學到知識,構造符號棧順利完成表示式的求值。

#include <stdio.h>
#include <string.h>
#define MAX 205

/*
這道題目主要採用棧來求解
為了鍛鍊使用C語言解決問題的能力,這裡通過陣列來模擬棧
*/
struct Node
{
    double num;
    char op;
    int flag;
};

struct Node Stack[MAX];//符號棧
struct Node Queue[MAX];//用來存放字尾表示式
char str1[MAX];
char str2[MAX];
int op[256];

//將中綴表示式轉化為字尾表示式
int Change(int length)
{
    double num;
    struct Node temp;
    int i;
    int cnt=0;
    int top=0;
    for(i=0;i<length;)
    {
        //如果是運算元
        if(str2[i]>='0'&&str2[i]<='9')
        {
            temp.flag=1;
            temp.num=0;
            while(str2[i]!='\0'&&str2[i]>='0'&&str2[i]<='9')
            {
                temp.num=temp.num*10+str2[i]-'0';
                i++;
            }
            Queue[cnt++]=temp;
        }
        //如果是運算子,則需要先比較運算子與當前棧頂符號的優先順序
        //如果棧頂符號優先順序更高,則要加入到佇列陣列當中
        //如果優先順序較低的話,則將符號壓入到符號棧當中
        else
        {
            temp.flag=0;
            while(top!=0&&op[str2[i]]<=op[Stack[top-1].op])//這裡注意棧頂指標等於棧頂位置+1
            {
                Queue[cnt++]=Stack[--top];
            }
            temp.op=str2[i];
            Stack[top++]=temp;
            i++;
        }
    }
    while(top!=0)//清空棧,構造完整的字尾表示式
    {
        Queue[cnt++]=Stack[--top];
    }
    return cnt;
}

double Cal(int cnt)//計算字尾表示式
{
    double temp1,temp2;
    struct Node cur,temp;
    int top=0;
    int i,j;
    for(i=0;i<cnt;i++)
    {
        cur=Queue[i];
        if(cur.flag==1) Stack[top++]=cur;
        else
        {
            //特別注意top必須加入字首--,因為top指標總是等於棧頂元素位置+1
            temp2=Stack[--top].num;//運算元2
            temp1=Stack[--top].num;//運算元1
            temp.flag=1;
            if(cur.op=='+') temp.num=temp1+temp2;
            else if(cur.op=='-') temp.num=temp1-temp2;
            else if(cur.op=='*') temp.num=temp1*temp2;
            else temp.num=temp1/temp2;
            Stack[top++]=temp;
        }
    }
    return Stack[top-1].num;
}

int main()
{
    op['+']=op['-']=1;
    op['*']=op['/']=2;
    while(fgets(str1,205,stdin)&&strcmp(str1,"0\n")!=0)
    {
        int len=strlen(str1);
        int i,j=0;
        for(i=0;i<len;i++)
        {
            if(str1[i]==' '||str1[i]=='\n') continue;
            else str2[j++]=str1[i];
        }
        str2[j]='\0';
        int cnt=Change(j);
        printf("%.2f\n",Cal(cnt));
    }
    return 0;
}

 

相關文章