stack(栈)

学习笔记——栈(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():求栈大小,返回栈中的元素个数

thank you

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值