|
发表于 2023-3-2 16:51:50
|
显示全部楼层
回帖奖励 +1 鱼币
头一次处理波兰表达式,试着写了写- #include <cctype>
- #include <iostream>
- #include <ranges>
- #include <stack>
- #include <vector>
- struct Token{
- enum class Type{
- Operator,
- Value
- }type;
- union Value{
- unsigned char operation;
- unsigned int value;
- }value;
- };
- std::istream& operator>>(std::istream& in, Token& token){
- decltype(in.peek()) c;
- do{
- c = in.get();
- }while(!isdigit(c) && c != '+' && c != '-' && c != '*' && c != '/' && !in.eof());
- if(in.eof()) return in;
- switch(c){
- case '+':
- case '-':
- case '*':
- case '/':
- token.type = Token::Type::Operator;
- token.value.operation = c;
- return in;
- }
- token.type = Token::Type::Value;
- token.value.value = c - '0';
- while(isdigit(c = in.get())){
- token.value.value = (token.value.value << 3) + (token.value.value << 1) + (c - '0');
- }
- if(!in.eof()) in.unget();
- return in;
- }
- int main(){
- std::vector<Token> tokens;
- Token temp;
- while(!std::cin.eof()){
- std::cin >> temp;
- tokens.push_back(temp);
- }
- std::stack<unsigned int> stack;
- for(const auto& token: std::ranges::reverse_view(tokens)){
- if(token.type == Token::Type::Value) stack.push(token.value.value);
- else{
- auto lhs = stack.top();
- stack.pop();
- auto rhs = stack.top();
- stack.pop();
- decltype(lhs) result;
- switch(token.value.operation){
- case '+':
- result = lhs + rhs;
- break;
- case '-':
- result = lhs - rhs;
- break;
- case '*':
- result = lhs * rhs;
- break;
- case '/':
- result = lhs / rhs;
- break;
- }
- stack.push(result);
- }
- }
- std::cout << stack.top();
- return 0;
- }
复制代码 |
|