面试题77:前缀、中缀、后缀表达式的相互转换
2016-04-11 19:17
585 查看
题目:写个函数,一个根据中缀表达式写出后缀缀表达式
#include<iostream> #include <vector> #include <stack> using namespace std; bool IsOperator(char c) { const char ops[] = "+-*/"; for (int i = 0; i < sizeof(ops); i++) { if (c == ops[i]) return true; } return false; } /* 判断优先级: 如果a比b高,返回1,;如果相等,返回0;如果a比b低,返回-1. */ int Firster(char a, char b) { if (a == '(') return -1; //优先级最低 if (a == '+' || a=='-') { if (b == '*' || b == '/') return -1; else return 0; } if (a == '*' || a == '/') { if (b == '+' || b == '-') return 1; else return 0; } return 0; //这句只是为了消除警告 } /* 将前缀转为后缀 */ void InfixToSuffix(const vector<char> infix, vector<char> &suffix) { stack<char> oChar; int size = infix.size(); char temp; //int index = 0; for (int i = 0; i < size; i++) { temp = infix[i]; if (temp == '(') oChar.push(temp); else if (temp == ')') { while (oChar.top() != '(') { suffix.push_back(oChar.top()); oChar.pop(); } oChar.pop(); } else { if (!IsOperator(temp)) oChar.push(temp); else { while (!oChar.empty() && Firster(oChar.top(), temp) >= 0) //理解这部分 { suffix.push_back(oChar.top()); oChar.pop(); } oChar.push(temp); } } } while (!oChar.empty()) { suffix.push_back(oChar.top()); oChar.pop(); } suffix.push_back('\0'); } int main(){ char arr[] = "9+(3-1)*3+9/2"; vector<char> infix(arr, arr + strlen(arr)); vector<char> re; InfixToSuffix(infix, re); for (unsigned int i = 0; i < re.size(); i++) cout << re[i]; cout << endl; return 0; }
相关文章推荐
- 面试题:对1、2、2、3、4、5六个数字进行排列组合
- 程序员遇到Bug时的30个反应
- 项目死沉半年,面试失败根源
- Java常用排序算法+程序员必须掌握的8大排序算法+二分法查找法
- 面试积累 简历添加
- 为大龄程序员找出路,破解程序员是一碗青春饭之迷
- 面试问题集锦
- 最基础、最全面的iOS面试题目
- 那些著名或非著名的iOS面试题-后编
- 深入详解多线程第一篇_多线程笔试面试题汇总
- 面试前——做好准备
- LeetCode(45)-Bulls and Cows
- 前端开发面试题及答案
- 71道经典Android面试题和答案,重要知识点都包含了
- 【转载】 Java线程面试题 Top 50
- 程序员的一些心得体验!
- 国内某社交通讯大佬面试题(二)
- 剑指offer-面试题37:两个链表中的一个公共结点
- [算法]二维数组循环输出
- LeetCode(44)- Isomorphic Strings