算術表示式有字首表示法、中綴表示法和字尾表示法等形式。字首表示式指二元運算子位於兩個運算數之前,例如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個字元的字首表示式,只包含 以及運算數...