#栈的基本原理
知识讲解
栈也是一种操作(或者说运算)受到限制的特殊线性表。其插入进栈和删除操作都限制在表的一端进行,这一端被称为“栈顶(top)”,相对a的另一端称为“栈(bottom)”。插入操作一般称之为“进栈(PUSH)或者“压栈”,删除操作称之为“出栈(POP)”栈的特点是“先进后出(FIFO, First In Last Out),就像家里洗碗吃饭先洗好的碗叠在最下面,后洗好的叠在上面,用的时候是先用后洗好(上面)的碗。
栈的存储和实现方式也有数组模拟与链表模拟两种,这里主要介绍数组方式。假设已经定义了int类型的stk数组存储栈,top表示顶指针,那么stk[top]存储的就是栈顶元素。
#栈的基本操作:
(1)初始化栈 stackvis ,定义一个栈
(2)入栈 vis.push(x)
(3)出栈 vis.pop()
(4)判断是否为空 vis.empty()
(5)判断栈中元素的数量vis.size()
(6)得到栈的栈顶元素 vis.top()
综上: #include
用<bits/stdc++.h>则无需考虑头文件。
例题1 程序员输入问题
Description
程序员输入程序出现差错时,可以采取以下的补救措施:按错了一个键时,可以补按一个退格符“#”,以表示前一个字符无效;发现当前一行有错,可以按一个退行符“@”,以表示“@”与前一个换行符之间的字符全部无效。
Input
输入一行字符,个数不超过 100。
Output
输出一行字符,表示实际有效字符。
Sample Input
sdfosif@for (ii#=1,#;i<.#=8;i+++#);
Sample Output
for (i=1;i<=8;i++);
代码如下:
#include <bits/stdc++.h>
using namespace std;
int main()
{
stack <char> s1;
stack <char> s2;//输出时就靠它了
char str[110];
gets(str);
int len=strlen(str);
for(int i=0; i<len; i++)
{
if(str[i]=='@')
{
while(!s1.empty())//判断栈是否为空
{
s1.pop();//如果栈不为空,则一直执行出栈操作,直到栈为空为止,注意出栈操作一次只能出去一个元素
}
continue;//直接进行i++操作,忽略本次循环的后续语句
}
if(str[i]=='#')
{
if(!s1.empty())
{
s1.pop();
continue;//本次只需操作一次就符合题意
}
}
s1.push(str[i]);//如果都不符合前面两个条件那就乖乖进栈叭
}
while(!s1.empty())//利用栈先进后出,后进先出的性质,
{
s2.push(s1.top());
s1.pop();
}
while(!s2.empty())
{
printf("%c",s2.top());
s2.pop();
}
printf("\n");
return 0;
}
例题2
Description
假设表达式中允许包含圆括号和方括号两种括号,其嵌套的顺序随意,如([]())或[([][])]等为正确的匹配,[(])或([]()或(()))均为错误的匹配。
本题的任务是检验一个给定表达式中的括号是否正确匹配。
输入一个只包含圆括号和方括号的字符串,判断字符串中的括号是否匹配,匹配就输出“OK”,不匹配就输出“Wrong”。
Input
一行字符,只含有圆括号和方括号,个数小于 255。
Output
匹配就输出一行文本“OK”,不匹配就输出一行文本“Wrong”。
Sample Input
[(])
Sample Output
Wrong
代码如下:
#include <bits/stdc++.h>
using namespace std;
stack<char>s1;
char str[1010];
int len;
char tmp;
int main()
{
scanf("%s",str);
len=strlen(str);
for(int i=0; i<len; i++)
{
if(s1.empty())//读入第一个元素
{
s1.push(str[i]);
}
else
{
tmp=s1.top(); if(str[i]==']'&&tmp=='['||str[i]==')'&&tmp=='(')//进行匹配
{
s1.pop();//若匹配成功则出栈同时str[i]不会进入栈
}
else
{
s1.push(str[i]);//匹配不成功则进栈
}
}
}
if(s1.empty())
{
printf("OK\n");
}
else
{
printf("Wrong\n");
}
return 0;
}