最初的方法,不是很简便, 其实可以直接遍历整个表达式
// 用栈实现求逆波兰表达式的值
/*********************************************************************
养成先手写算法,再编码修正的习惯:
1.遍历串,分离每个子串并放入vector
2.遍历vector,若是数字则压入栈,否则弹出b,a计算后将结果压入栈
3.输出最终结果
**********************************************************************/
#include <iostream>
#include <string>
#include <vector>
#include <sstream>
#include <cctype>
using namespace std;
// 定义栈
using Stack = struct Stack {
int top = 0;
string str[100];
};
// 入栈
bool Push(Stack&, const string);
// 出栈
bool Pop(Stack&, string&);
void ElemToVector(const string&, std::vector<string>&);
void Calc(Stack&, const std::vector<string>&);
inline bool is_digit(const string&);
inline int ConvertToInt(const string&);
inline char ConvertTOChar(const string&);
inline string ConvertToString(const int&);
inline void iCalc(Stack&, string&);
int main(int argc, char** argv)
{
Stack S;
std::vector<string> sv;
string str("234 34+2*$");
ElemToVector(str, sv);
Calc(S, sv);
cout << S.str[0];
return 0;
}
void iCalc(Stack &S, string &x)
{
string b, a; // 栈中存放的是字符串
int nb, na;
Pop(S, b);
Pop(S, a);
nb = ConvertToInt(b);
na = ConvertToInt(a);
char oper = ConvertTOChar(x);
switch(oper)
{
case '+':
Push(S, ConvertToString(na+nb));
break;
case '-':
Push(S, ConvertToString(na-nb));
break;
case '*':
Push(S, ConvertToString(na*nb));
break;
case '/':
Push(S, ConvertToString(na/nb));
break;
}
}
string ConvertToString(const int &e)
{
string result;
stringstream stream;
stream << e;
stream >> result;
return result;
}
char ConvertTOChar(const string& str)
{
char result;
stringstream stream;
stream << str;
stream >> result;
return result;
}
int ConvertToInt(const string &str)
{
int result;
stringstream stream;
stream << str;
stream >> result;
return result;
}
bool is_digit(const string &str)
{
for(const auto &x : str)
if(!isdigit(x)) return false;
return true;
// stringstream方法在串一开始有数字但是后面有符号时失效
// 会把开头的数字全部输入到数字变量中
// int temp;
// istringstream istream(str);
// if(istream >> temp) {
// cout << "yes" << temp << endl;
// return true;
// }
// return false;
}
void Calc(Stack &S, const std::vector<string> &sv)
{
for(const auto &x : sv) {
if(is_digit(x)) {
Push(S, x);
}
else {
// 若不是纯数字,则遍历
string sum;
for(const auto &c : x) {
if(c == '$') continue;
// 若为连续数字,存入字符串
if(isdigit(c)){
string str(1,c);
sum += str;
}
else {
// 若数字字符串结束, 将数字字符串压入栈
if(sum != "") {
Push(S, sum);
sum = "";
}
string oper(1, c);
iCalc(S, oper);
}
}
}
}
}
void ElemToVector(const string &str, std::vector<string> &sv)
{
istringstream istream(str);
string elem;
while(istream >> elem)
if (elem != "$") sv.push_back(elem);
}
bool Push(Stack &S, const string e)
{
S.str[S.top++] = e;
return true;
}
bool Pop(Stack &S, string &e)
{
e = S.str[--S.top];
return true;
}