最近在學資料結構,剛學完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應用程式...