📜  c++中的堆栈算法(1)

📅  最后修改于: 2023-12-03 14:39:58.134000             🧑  作者: Mango

C++中的堆栈算法

在计算机科学中,堆栈(或栈)是一种抽象数据类型,它是一个线性数据结构,只允许在一端进行插入和删除操作。堆栈遵循先进后出(LIFO)的原则,最新添加的元素最后被删除。

堆栈的实现

在C++中,我们可以使用标准模板库(STL)中的<stack>头文件来实现堆栈。

#include <stack>

std::stack<int> my_stack;

以上代码创建了一个名为my_stack的整数类型堆栈。我们可以使用以下函数来操作堆栈:

  • push():将元素插入堆栈的顶部
  • pop():从堆栈的顶部删除元素
  • top():返回堆栈顶部的元素
  • empty():检查堆栈是否为空
  • size():返回堆栈中元素的数量
my_stack.push(42);        //将42压入堆栈顶部
my_stack.pop();           //从堆栈顶部弹出元素
int top_element = my_stack.top();    //返回堆栈顶部元素的值
bool is_empty = my_stack.empty();   //检查堆栈是否为空
int stack_size = my_stack.size();   //返回堆栈大小
应用场景

堆栈算法广泛用于许多计算机科学中的问题,包括:

  • 括号匹配
  • 函数调用和返回
  • 追踪递归调用
  • 表达式求值
  • 中缀转后缀表达式

一些具体案例解析:

括号匹配

在编程中,括号匹配是非常常见和重要的。该问题交由stack来处理会更加容易实现。

以下是使用Stack判断字符串中的括号是否匹配:

bool is_balanced(std::string expression){
    std::stack<char> my_stack;
    for(char character : expression){
        switch(character){
            case '(':
            case '[':
            case '{':
                my_stack.push(character);
                break;
            case ')':
                if(my_stack.empty() || my_stack.top()!='(') return false;
                else my_stack.pop();
                break;
            case ']':
                if(my_stack.empty() || my_stack.top()!='[') return false;
                else my_stack.pop();
                break;
            case '}':
                if(my_stack.empty() || my_stack.top()!='{') return false;
                else my_stack.pop();
                break;
            default:
                break;
        }
    }
    return my_stack.empty();
}
表达式求值

用堆栈来求一个表达式的值也是常见的场景。

以下是使用Stack来进行中缀表达式求值的代码:

#include<stack>
#include<string>

int priority(char op){
    switch(op){
        case '+':
        case '-':
            return 1;
        case '*':
        case '/':
            return 2;
        default:
            return 0;
    }
}

std::string infix_to_postfix(std::string infix_expression){
    std::stack<char> operator_stack;
    std::string postfix_expression;
    for(char character: infix_expression){
        if(isdigit(character)) postfix_expression+=character;
        else if(character=='+' || character=='-' || character=='*' || character=='/'){
            while(!operator_stack.empty() && priority(operator_stack.top())>=priority(character)){
                postfix_expression+=operator_stack.top();
                operator_stack.pop();
            }
            operator_stack.push(character);
        }
        else if(character=='(') operator_stack.push(character);
        else if(character==')'){
            while(!operator_stack.empty() && operator_stack.top()!='('){
                postfix_expression+=operator_stack.top();
                operator_stack.pop();
            }
            operator_stack.pop();
        }
    }
    while(!operator_stack.empty()){
        postfix_expression+=operator_stack.top();
        operator_stack.pop();
    }
    return postfix_expression;
}

double evaluate_postfix(std::string postfix_expression){
    std::stack<double> operand_stack;
    for(char character: postfix_expression){
        if(isdigit(character)){
            operand_stack.push(character-'0');
        }
        else {
            double operand2 = operand_stack.top();
            operand_stack.pop();
            double operand1 = operand_stack.top();
            operand_stack.pop();
            if(character=='+') operand_stack.push(operand1+operand2);
            else if(character=='-') operand_stack.push(operand1-operand2);
            else if(character=='*') operand_stack.push(operand1*operand2);
            else if(character=='/') operand_stack.push(operand1/operand2);
        }
    }
    return operand_stack.top();
}
Conclusion

堆栈算法是计算机科学中必备的工具之一,可以方便地解决各种不同问题,包括数据结构、算法和编程等。C++作为一种高效的编程语言,其标准模板库(STL)提供的堆栈操作使堆栈算法的实现更加方便快捷。