学习笔记——栈(stack)
栈的定义
栈是一种线性表,对它的插入和删除都只能够在表的同一端进行。这一端叫做“栈顶”,另一端则叫做“栈底”。
栈的特点
1.外特性:后进先出(LIFO);先进后出
2.栈的作用:保护现场
3.典型应用:递归
基本操作
栈顶指针top,数组a[maxn]
1.入栈
top=0;
a[++top]=x;
//x为要加入栈顶的成员
2.出栈
x=a[top];
top--;
//栈顶元素赋值给x
例题
1.例1:P4387 验证栈序列
题目分析:根据出栈的顺序,模拟入栈的顺序,验证该顺序是否合理
例如:入栈序列a[]:1 2 3 4 5 出栈序列b[]:5 4 3 2 1
模拟入栈过程:将a[]中的元素依次入栈,每入栈一个就检查出栈序列是否匹配,a[]所有元素都入栈后退出循环,检查栈中是否还存在元素,若存在则表示不存在该出栈序列。
核心代码
for(int i=1;i<=n;i++){
s.push(a[i]);
while(s.top()==b[k]){//比对出栈序列
s.pop();k++;
if(s.empty()) break;
}
2.例2:括号匹配
题目:(与原题略有不同)
【题目描述】
在某个字符串(长度不超过100)中有左括号、右括号和大小写字母;规定(与常见的算数式子一样)任何一个左括号都从内到外与在它右边且距离最近的右括号匹配。写一个程序,找到无法匹配的左括号和右括号,输出原来字符串,并在下一行标出不能匹配的括号。不能匹配的左括号用"¥"标注,不能匹配的右括号用"?“标注。
【输入】
输入包括多组数据,每组数据一行,包含一个字符串,只包含左右括号和大小写字母,字符串长度不超过100。
【输出】
对每组输出数据,输出两行,第一行包含原始输入字符,
第二行由"¥”,"?"和空格组成,“¥"和”?"表示与之对应的左括号和右括号不能匹配。
for(i=0;i<len;i++){
if(a[i]=='('){
top++;stack1[top]=i;//左括号入栈
b[i]=' ';
}
else if(a[i]==')')
if(top>0) {
top--;b[i]=' ';//右括号出栈
}
else b[i]='?';//栈为空则这个右括号匹配不成功
else b[i]=' ';//不是括号直接赋值空格
}
while(top>0){
b[stack1[top]]='¥';
top--;
}
栈的STL(standard template libaray - 标准模板库)
是的它又又又又又来了
函数如下:
stack<int>s:创建一个空栈s,数据类型为int
s.push(x):x入栈
pop():出栈(删除栈顶元素)
s.top():取栈顶(不出栈,获取栈顶元素)
empty():判断栈是否为空,若为空则返回true
size():求栈大小,返回栈中的元素个数