栈的应用--四则运算 c++

四则运算主要分为两个部分:

  1. 中缀转后缀
    规则为:先遍历中缀表达式的每一个字符,如果是数字直接输出到后缀表达式,如果是符号,需要判断与栈顶符号的优先级,是右括号或者优先级高于栈顶符号(乘除优先于加减)则依次输出出栈并输出,然后将当前符号压入栈。这里把符号分为几类:①’(’,入栈;
    ②’)’,栈顶符号依次出栈并输出直到栈顶元素为’(’,然后将当前符号入栈;
    ③’+’or’-‘,栈顶符号依次出栈直到栈为空或者栈顶元为’(’,然后把当前符号压入栈。
    ④’’ or ‘/’, 为栈顶符号为’‘或’/’的元素依次出栈,直到遇到其他符号或者栈为空,然后把当前符号压栈。
    最后将栈中剩余分符号输出。
string BackToMid(string s)
{
    string ret;
    stack<int> stk;
    for(string::size_type i = 0; i< s.size(); i++)
    {
        if( isdigit(s[i]) )
        {
            ret += s[i];
            if( (i < s.size() -1 && !isdigit(s[i+1</
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是使用单链表解决四则运算C++代码示例: ```c++ #include <iostream> #include <stack> #include <cstring> using namespace std; // 定义单链表节点结构体 struct Node { char value; // 存储操作数或操作符 Node* next; // 指向下一个节点 }; // 将中缀表达式转换为后缀表达式 string infixToPostfix(string infix) { string postfix = ""; // 存储后缀表达式 stack<char> s; // 存储操作符的 for (int i = 0; i < infix.length(); i++) { char c = infix[i]; if (isdigit(c)) { // 操作数直接输出 postfix += c; } else if (c == '(') { // 左括号入 s.push(c); } else if (c == ')') { // 右括号将中操作符输出直到遇到左括号 while (!s.empty() && s.top() != '(') { postfix += s.top(); s.pop(); } s.pop(); // 弹出左括号 } else { // 操作符 while (!s.empty() && s.top() != '(' && ((c == '*' || c == '/') && (s.top() == '+' || s.top() == '-'))) { postfix += s.top(); s.pop(); } s.push(c); } } while (!s.empty()) { // 将中剩余的操作符输出 postfix += s.top(); s.pop(); } return postfix; } // 计算后缀表达式 int calculate(string postfix) { Node* head = nullptr; // 链表头节点 Node* tail = nullptr; // 链表尾节点 for (int i = 0; i < postfix.length(); i++) { char c = postfix[i]; if (isdigit(c)) { // 操作数创建新节点插入链表尾部 Node* node = new Node; node->value = c; node->next = nullptr; if (tail == nullptr) { head = tail = node; } else { tail->next = node; tail = node; } } else { // 操作符弹出两个操作数计算,并将计算结果插入链表尾部 Node* node1 = tail; tail = tail->next; Node* node2 = tail; tail = tail->next; int val1 = node1->value - '0'; int val2 = node2->value - '0'; int result; switch (c) { case '+': result = val2 + val1; break; case '-': result = val2 - val1; break; case '*': result = val2 * val1; break; case '/': result = val2 / val1; break; } Node* node = new Node; node->value = result + '0'; node->next = nullptr; if (tail == nullptr) { head = tail = node; } else { tail->next = node; tail = node; } } } int result = head->value - '0'; delete head; return result; } int main() { string infix = "3*(2+5)-6/(1+2)"; string postfix = infixToPostfix(infix); cout << "后缀表达式:" << postfix << endl; int result = calculate(postfix); cout << "计算结果:" << result << endl; return 0; } ``` 注意,这里的代码只能处理整数四则运算,如果需要处理小数或者更复杂的表达式,需要对代码进行修改。同时,由于单链表的插入和删除操作比较耗时,实际应用中可能需要使用其他数据结构,比如双向链表或者树来实现。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值