**還新增了乘方的優先順序,自行參考
一開始我寫的只能輸入個位數,後來想了好久才解決,主要是在判斷是否為運算子後,若不是運算子,別急著入棧,用乙個標記陣列記著,若下乙個字元還不是運算子,則利用strcat函式鏈結之前標記陣列和這乙個字元,直到下乙個字元是運算子為止,才入棧。
至於負數的運算,則要判斷是否連續兩個都為運算子,且前乙個運算子為『(』後乙個運算子為『-』,若是就加個0入棧即可。
#include
#include
#include
#include
#define m 10
#define add 10
/*字元棧*/
typedef
struct
sqstack;
int init(sqstack &s)
s.top = 0;
s.stacksize = m;
return1;}
int push(sqstack &s, char e)
s.base = newbase;
s.stacksize += add;
}s.base[s.top++] = e;
return1;}
int pop(sqstack &s, char &e)
e = s.base[--s.top];
return1;}
int gettop(sqstack s, char &e)
e = s.base[s.top - 1];
return1;}
/*運算元棧*/
typedef
struct
datastack;
int init_data(datastack &s)
s.top = 0;
s.stacksize = m;
return1;}
int push_data(datastack &s, float e)
s.base = newbase;
s.stacksize += add;
}s.base[s.top++] = e;
return1;}
int pop_data(datastack &s, float &e)
e = s.base[--s.top];
return1;}
int gettop_data(datastack s, float &e)
e = s.base[s.top - 1];
return1;}
/*判斷算符優先關係*/
char judge(char a, char b)
else
case
'-':
if (b == '+' || b == '-' || b == ')' || b == '#')
else
case
'*':
if (b == '(' || b == '^')
else
case
'/':
if (b == '(' || b == '^')
else
case
'#':
if (b == '#')
else
if (b == ')')
else
case
'(':
if (b == ')')
else
if (b == '#')
else
case
')':
if (b == '(')
else
case
'^':
if (b == '(')
else
default:
return
' ';
}}/*計算操作*/
float action(float a, char k, float b)
}/*判斷運算子or運算元*/
int isysf(char c)
return0;}
/*正片*/
float hehe(char *input)
; char *c;
init(optr);
init_data(opnd);
push(optr, '#');
c = strcat(input, ap);
strcpy(tempdata, "\0");
gettop(optr, e);
while (c[i] != '#' || e != '#')
flag = 0;
}else
else
/*連續兩個都是運算子卻不是負數*/}}
else
}flag = 1;
}gettop(optr, e);
}gettop_data(opnd, ans);
return ans;
}int main()
return
0;}
算術表示式求值 「算符優先順序法」 「字尾表示式法」
該方法來自嚴蔚敏版資料結構,基本思路是 設定兩個工作棧,乙個運算元棧,乙個操作符棧,在 自左至右 掃瞄算術表示式時,遇到運算元直接入運算元棧,若遇到操作符,則根據操作符優先順序判斷下一步操作 操作符優先順序規則 若其優先順序高於棧頂操作符,則入棧,否則 相等或小於 彈出棧頂算符並從運算元棧彈出兩個運...
簡單表示式求值 算符優先法
周五加班的時候,在九度oj上練習了一道簡單表示式求值的題目,用到了 算符優先法 這裡簡單的記錄一下 讀入乙個只包含 的非負整數計算表示式,計算該表示式的值。測試輸入包含若干測試用例,每個測試用例佔一行,每行不超過200個字元,整數和運算子之間用乙個空格分隔。沒有非法表示式。當一行中只有0時輸入結束,...
算術表示式求值 資料結構 C語言
1.實驗目的 熟練掌握棧的基本操作,深入了解棧的特性,能在實際問題的背景下靈活運用他們,並加深對這種結構的理解。2.實驗內容 設計乙個程式,演示用算符優先法對算術表示式求值的過程。以字串行的形式從終端輸入語法正確的 不含變數的整數表示式。利用教科書表3.1給出的算符優先關係,實現對算術四則運算混合運...