C 計算四則運算表示式程式

2021-07-10 16:20:36 字數 2302 閱讀 8700

最近在學資料結構,剛學完expression tree,解答了我多年的疑惑。以前就想寫乙個二十四點的小遊戲,計算機發4張牌,玩家在規定時間內想出4張牌任意四則運算後得到24的表示式。框架搭好,也可以發牌了,電腦怎麼答題可以遍歷所有可能性,得到24就中止。但玩家輸入表示式,怎麼計算出值是關鍵問題。現在終於知道解法了。

**如下:

#include 

#include

#include

using

namespace

std;

int isnumber(char c);

/* 單個元素 */

struct element

;/* 返回運算子結合性 */

bool isleft2right(char c)

}/* 返回運算子的優先順序 */

int rank(char s)

int err=-1;

if (isnumber(s[0])) err=0;

return err;

}/* 是運算子 */

int isoperator(char c)

return0;}

/* 有效性檢查(返回0則出現異常字元) */

int islegal(char c)

int isnumber(char c)

/* 由位數得到應該相乘的倍數 如digit=2返回100 */

int digit2num(int digit)

return temp;

}/*由in order佇列得到post order佇列*/

int inqueue2postqueue(queue

*post,queue

*in)//返回0:正常 1:括號不配對

else

else

else

}in->pop();

}else

//不是括號

else

//右結合

while (temp.size()>0 && rank(in->front().operate)//臨時棧有內容,且新進符號優先順序低,則擠出高優先順序,但不擠出同優先順序符號(因為右結合)

;temp.push(in->front());//高優先順序已全部擠出,當前符號入棧

in->pop();}}

}}

while (temp.size()>0)

return sq_err;

}/*由字串表示式得到in order佇列*/

int str2queue(queue

*inorder,char expression)

if (type)//數字

tempe.type=0;

tempe.value=num*sign;

sign=1;//sign符號正常化

tempe.operate[0]='\0';

(*inorder).push(tempe);

}else

//不是數字

else

//出現非法字元

if (i==0 && isoperator(expression[i])) //首字元出現非-的符號

if (i+1

<(int)strlen(expression) && isoperator(expression[i])==1 && expression[i+1]==')') //出現*)形式

if (i-1>=0 && isoperator(expression[i])==1 && (expression[i-1]=='(' || isoperator(expression[i-1])==1)) //出現(*形式或**形式

tempe.type=1;

tempe.value=0;

tempe.operate[0]=expression[i];

tempe.operate[1]='\0';

tempe.left2right=isleft2right(expression[i]);

tempe.op_num=2;

(*inorder).push(tempe);

}i++;}}

return err;

}/*由運算子c及a,b計算出值*/

int calcnum(int a,int b,char c)

}/*由post order序列計算出值*/

int calc(queue

*post)

else

}return temp.top().value;

}int main()

}

四則運算表示式求值

03 四則運算表示式求值 輸入輸入為四則運算表示式,僅由陣列 四則運算符 左右括號組成,不含空格。假設運算子結果都是整數。輸出輸出這個表示式的值 分析首先我們要搞清楚表示式的定義是什麼 表示式 由乙個或者多個項組成,多個項的表示式由 連線 項 由乙個或者多個因子組成,多個因子由 連線 因子 由 表示...

四則運算表示式求值

表示式求值是關於棧的應用,涉及到中綴與字尾式的轉換,本文關於10以內不帶括號的四則運算。9 3 4 x 3 24 1 x 9 5 9 9 5 x 9 4 6 2 x 3 1 42 思路 遇到數字直接入數字棧。遇到運算子,第乙個運算子直接入符號棧,後面的需要與符號棧棧頂元素比較優先順序。若當前優先順序...

四則運算表示式總結

這兩周完成了第乙個個人專案 四則運算表示式。在整個開發的過程中我有一些收穫也發現了自身的一些問題。下面就分條簡述一下。1 實現隨機生成任意長度的四則表示式 括號 2 實現四則表示式的計算 包括分數 3 實現接收使用者對某四則運算表示式計算的結果並判斷正確性。4 實現結合1 2 3功能的mfc應用程式...