資料結構 PTA求字首表示式的值

2021-07-24 06:14:42 字數 1710 閱讀 1839

算術表示式有字首表示法、中綴表示法和字尾表示法等形式。字首表示式指二元運算子位於兩個運算數之前,例如2+3*(7-4)+8/4的字首表示式是:+ + 2 * 3 - 7 4 / 8 4。請設計程式計算字首表示式的結果值。

輸入格式:

輸入在一行內給出不超過30個字元的字首表示式,只包含+、-、*、\以及運算數,不同物件(運算數、運算符號)之間以空格分隔。

輸出格式:

輸出字首表示式的運算結果,保留小數點後1位,或錯誤資訊error。

輸入樣例:

+ + 2 * 3 - 7 4 / 8 4

輸出樣例:

13.0

————————————

其實如果只是對於一位數就非常簡單直接從後向前掃瞄即可,但是如果要滿足兩位數可以進棧,就有一點麻煩,需要判斷有幾位,再將其入棧,我這裡用的是鏈棧,其實可以用順序棧,就當做乙個小小練習吧~

從後向前掃瞄,如果不是空格就要進行判斷,判斷有幾位,如果是兩位就存入臨時的陣列中,再利用反轉(要吐槽這裡不能使用庫函式的strrev(),只好再重新寫乙個了。。。)和atof()函式將char轉換為double型別,如果是一位直接入棧,如果是運算子就讓兩個數出棧,出棧前要判斷是否為空(這裡很容易出現錯誤的情況,如果空直接錯誤就退出就好~),之後直接進行運算,記得將運算結果入棧。

最後輸出判斷top的next是不是空就好,就是保證最後鏈棧只有乙個元素,說明正確,其他情況不正確。

#include 

#include

#include

#define n 30

//定義鏈棧

typedef

struct snode

stacknode,*linkstack;

//置空棧

linkstack top=null;

//入棧

linkstack push_linkstack(double x)

//出棧

double pop_linkstack()

}//計算

double calcul(double a,double b,char c)

}//判棧空

int empty_seqstack()

//字串反轉

char *revstr(char *str, int len)

}return str;

}int main()

else

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

if(!empty_seqstack())

b=pop_linkstack();

else

if(s[i]=='/'&&b==0)

result=calcul(b,a,s[i]);

push_linkstack(result);

}else

}else

strrevtemp=revstr(temp,strlen(temp));

push_linkstack(atof(strrevtemp));

i++;}}

}if(top!=null)

printf("%.1lf",top->data);

else

printf("error");

return

0;}

PTA求字首表示式的值

算術表示式有字首表示法 中綴表示法和字尾表示法等形式。字首表示式指二元運算子位於兩個運算數之前,例如2 3 7 4 8 4的字首表示式是 2 3 7 4 8 4。請設計程式計算字首表示式的結果值。輸入在一行內給出不超過30個字元的字首表示式,只包含 以及運算數,不同物件 運算數 運算符號 之間以空格...

PTA 資料結構與演算法 7 21 求字首表示式的值

如有不對,不吝賜教 進入正題 算術表示式有字首表示法 中綴表示法和字尾表示法等形式。字首表示式指二元運算子位於兩個運算數之前,例如2 3 7 4 8 4的字首表示式是 2 3 7 4 8 4。請設計程式計算字首表示式的結果值。輸入格式 輸入在一行內給出不超過30個字元的字首表示式,只包含 以及運算數...

pta7 21 求字首表示式的值

東軟學習小組成員 夜楓 題目 算術表示式有字首表示法 中綴表示法和字尾表示法等形式。字首表示式指二元運算子位於兩個運算數之前,例如2 3 7 4 8 4的字首表示式是 2 3 7 4 8 4。請設計程式計算字首表示式的結果值。輸入格式 輸入在一行內給出不超過30個字元的字首表示式,只包含 以及運算數...