此次修改了上次的版本,利用了堆栈的编程思想,实现了支持括号的四则运算
跟上个版本一样,吧表达式存储到a.txt中:
结果保存在b.txt中:
堆栈编程思路:
1. 建立两个堆,一个字符堆,用于存储+、-、*、/、%、=;一个数字堆,用于存储数字
2. 创建两个字符,一个存储堆顶的操作符,一个存储表达式中的操作符
3. 建立一个二维表,利用2.中的两个操作符转化为行和列,在二维表中找到对应的判断
4. 若是小于,则表示,表达式中的操作符优先级比原先的操作符优先级高,直接压入堆中存储
5. 若是大于,则表示堆顶的操作符优先级高,所以先计算,把数字堆中的两个数弹出,计算结果,压回堆中存储,并把表达式中的操作符压入字符堆中
6. 若为0,则表示表达式不合法
7. 若为=,则有两种情况,一个是表达式计算完成,把结果存储到answer中。另外一种是括号配对了,需要把前括号pop了
以上是主思路,次思路跟上次一样:
1. 打开a.txt;
2. 利用getline吧每行的表达式读出来,存入string类对象中;
3. 循环读取,循环计算结果;
4. 循环完成,把answer中的结果存储到b.txt;
差不多就这样,下面附上代码:
1 // Arithmetic3.cpp : 定义控制台应用程序的入口点。 2 // 3 4 #include "stdafx.h" 5 #include <iostream> 6 #include <fstream> 7 #include <string> 8 #include <vector> 9 #include <deque> 10 #include <stack> 11 #include <stdio.h> 12 13 using namespace std; 14 15 //+ - * / % ( ) = 16 char ss[8][8] ={{'>','>','<','<','<','<','>','>'}, 17 {'>','>','<','<','<','<','>','>'}, 18 {'>','>','>','>','>','<','>','>'}, 19 {'>','>','>','>','>','<','>','>'}, 20 {'>','>','>','>','>','<','>','>'}, 21 {'<','<','<','<','<','<','=','0'}, 22 {'>','>','>','>','>','0','>','>'}, 23 {'<','<','<','<','<','<','0','='}}; 24 //大于号,弹出数字,进行计算,小于号,压入堆栈中 25 26 //把字符转化成相应的行和列 27 void getRowCol (const char stackCh, const char ch, int& row, int& col) 28 { 29 switch (stackCh) 30 { 31 case '+': 32 row = 0; 33 break; 34 case '-': 35 row = 1; 36 break; 37 case '*': 38 row = 2; 39 break; 40 case '/': 41 row = 3; 42 break; 43 case '%': 44 row = 4; 45 break; 46 case '(': 47 row = 5; 48 break; 49 case ')': 50 row = 6; 51 break; 52 case '=': 53 row = 7; 54 break; 55 } 56 switch (ch) 57 { 58 case '+': 59 col = 0; 60 break; 61 case '-': 62 col = 1; 63 break; 64 case '*': 65 col = 2; 66 break; 67 case '/': 68 col = 3; 69 break; 70 case '%': 71 col = 4; 72 break; 73 case '(': 74 col = 5; 75 break; 76 case ')': 77 col = 6; 78 break; 79 case '=': 80 col = 7; 81 break; 82 } 83 84 } 85 86 //写入文件 87 void writeAnswer(vector<int>& iAnswer) 88 { 89 ofstream ofs("b.txt"); 90 for(vector<int>::size_type ix = 0; ix != iAnswer.size(); ix++) 91 { 92 ofs << iAnswer[ix] << ' '; 93 } 94 ofs.close(); 95 } 96 97 98 void countAnswer(vector<int>& iAnswer, string& str) 99 { 100 int temp = 0; 101 int row = 0 ,col = 0; 102 stack<int> iStk; //定义数据堆 103 stack<char> cStk; //定义字符堆 104 char stackCh = '