📅  最后修改于: 2023-12-03 14:39:58.134000             🧑  作者: Mango
在计算机科学中,堆栈(或栈)是一种抽象数据类型,它是一个线性数据结构,只允许在一端进行插入和删除操作。堆栈遵循先进后出(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();
}
堆栈算法是计算机科学中必备的工具之一,可以方便地解决各种不同问题,包括数据结构、算法和编程等。C++作为一种高效的编程语言,其标准模板库(STL)提供的堆栈操作使堆栈算法的实现更加方便快捷。