104bool ExpCalc::infixCalc(vector<Token>& tokens,double& res)
105{
106 Clear();
107 operators_stack.push(TER);
108 double x1,x2;
109 bool isOk;
110 for (int i = 0;i<tokens.size();i++)
111 {
112 if (tokens[i].type == Numeric)
113 {
114 operands_stack.push(tokens[i].x);
115 }else{
116 if (operators_stack.empty())
117 {
118 return false;
119 }
120 Operator nxt_op = tokens[i].op;
121 bool over = false;
122 while (!operators_stack.empty())
123 {
124 Operator op = operators_stack.top();
125 PRI pri = operatorPRIs[int(op)][int(nxt_op)];
126 switch(pri)
127 {
128 case HIGHER:
129 isOk = doWhenHigher(op);
130 break;
131 case LOWER:
132 isOk = doWhenLower(op,nxt_op);
133 over = true;
134 break;
135 case EQUAL:
136 isOk = doWhenEqual();
137 over = true;
138 break;
139 case NO_POSSIBLE:
140 return false;
141 default:
142 return false;
143 }
144 if (!isOk)
145 return false;
146 if(over)
147 break;
148 }
149 }
150 }
151 if (!operators_stack.empty() || operands_stack.size()!=1)
152 return false;
153 res = operands_stack.top();
154 return true;
155}
24Game.h 算24游戏的有关逻辑
01#ifndef GAME_H
02#define GAME_H
03class Game
04{
05public:
06 Game();
07 void GenNewNumbers();
08 bool hasSolutions();
09 void ShowNums();
10 void ShowSolution();
11 bool Calc(vector<Token>& tokens,double & res);
12 bool Check(vector<Token>& tokens);
13 static int minOperand;
14 static int maxOperand;
15private:
16 vector<double> solu_operands;
17 vector<Operator> solu_operators;
18 bool hasSolu;
19 string expression;
20
21 ExpCalc calc;//表达式计算器
22 int generated_operands[4];
23 int input_operands[4];
24 char input_operators[3];
25};
26#endif
24Game.cpp
001#include <stack>
002#include <time.h>
003#include <stdlib.h>
004#include <string>
005#include <algorithm>
006#include <vector>
007#include <cmath>
008#include <iostream>