栈的使用方法详细讲解
栈:是后进先出的线性表,表尾对栈有特殊的含义,称为栈顶(top)相应的,表头成为栈底(bottom)不含元素的空表称为空栈
栈定义在<stack>头文件中
下面是栈类成员函数原型:
//----容量capacity----
bool empty(); //测试是否为空栈
size_type size(); //返回栈的长度
//----元素存取element access-----
top(); //返回栈顶元素
//----栈运算operators-----
void push(const T& x); //进栈
void pop(); //出栈
栈的应用实例:
#include<iostream>
#include<stack>
using namespace std;
int main()
{
stack<int> S;
for (int i = 1; i <= 6; i++) S.push(i); //进栈S:1 2 3 4 5 6
while (!S.empty()) {
cout << S.top() << " ";//出栈S:6 5 4 3 2 1
S.pop();
}
return 0;
}
例题:
用栈来解决符号平衡问题。<>,(),{},[]这些符号的出现必须是成对的,输入一个字符串判断以上符号是否匹配
解题思路:
1、如果字符是一个括号符号,则将其推入栈中
2、如果字符是一个回括号符号,则当栈为空是报错,否则将栈元素弹出。如果弹出的符号不是对应括号符号则报错
3、在文件结尾,如果栈非空则报错
代码如下:
#include<iostream>
#include<string>
#include<stack>
using namespace std;
bool isbalance(const string& str)
{
int len = str.size();
stack<char> mystack;
for (int i = 0; i < len; i++) //遍历字符串中的各个字符,如果是括号就压入栈中
{
if (str[i] == '[' || str[i] == '{' || str[i] == '(' || str[i] == '<')
mystack.push(str[i]);
if (str[i] == ']' || str[i] == '}' || str[i] == ')' || str[i] == '>')//如果是回括号
{
if (mystack.empty())//如果栈为空则说明不平衡
{
cout << "the string is Unbalanced" << endl;
return false;
}
switch (str[i])
{
case ']':
{
if ('[' != mystack.top()) return false;
mystack.pop();
break;
}
case ')':
{
if ('(' != mystack.top()) return false;
mystack.pop();
break;
}
case '}':
{
if ('{' != mystack.top()) return false;
mystack.pop();
break;
}
case '>':
{
if ('<' != mystack.top()) return false;
mystack.pop();
break;
}
}
}
}
if (mystack.empty())
return true;
else
{
mystack.pop();
return false;
}
}
int main()
{
bool bal;
string str;
cin >> str;
bal = isbalance(str);
if (bal == true) cout << "string is balanced!" << endl;
else cout << "string is unblanced!" << endl;
return 0;
}
用bool类型的子函数来判断是否平衡,返回值类型是bool型,若这个表达式返回值是平衡的就返回true,若不平衡则返回false。
isbalance里面的参数str即为我们要检测的字符串
函数体解析:
要执行此程序首先我们得先从键盘输入一段字符串,我们把要检测的字符串长度放在变量len里面,定义一个名为mystack类型为char(字符类型)的栈,用for循环做一个压栈出栈的操作,依次检测字符串里面的字符,首先判断当前检测到的字符是否为[,(,{,<中的任何一个,若是,则将这个str[i]即这个括号压到栈里面去,但是如果我们检测到了回括号即:],),},>中的任何一个,首先判断这个栈是否为空,如果栈为空,则说明不平衡,此时输出:the string is Unblanced,再返回false,若不为空则进入switch循环结构,判断str[i]跟下面哪一种类型相同假设跟 ] 相符合,执行if语句,若栈顶元素跟 [ 不同则说明不平衡,返回false,若符合,则执行出栈退出switch结构,接下来结束for 循环之后若栈为空,即每有一个回括号我都能找到一个括号与之相匹配说明字符串是平衡的,向主调函数返回true,但是如果for循环结束之后,栈仍然不为空,则说明不平衡,返回false.到这里这断代码就结束了。
2021/5/23 和zry认识的第三天