栈和队列

时间:2019-04-18
本文章向大家介绍栈和队列,主要包括栈和队列使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

栈(stack)

又名堆栈,它是一种运算受限的线性表。其限制是仅允许在表的一端进行插入和删除运算。这一端被称为

栈顶(Top)

相对地,把另一端称为

栈底(Bottom)

向一个栈插入新元素又称作

进栈

入栈或压栈,它是把新元素放到栈顶元素的上面,使之成为新的栈顶元素;从一个栈删除元素又称作

出栈

或退栈,它是把栈顶元素删除掉,使其相邻的元素成为新的栈顶元素。

简单来说,元素的进栈和出栈是按照“后进先出(Last In First Out,LIFO)”的原则进行的

日常生活中也有许多类似栈应用的例子,例如手枪弹夹中子弹的装入和弹出过程,撂盘子和取盘子的过程,等等。

基本操作

empty() 堆栈为空则返回真

pop() 移除栈顶元素 (删除)

push() 在栈顶增加元素 (增加)

size() 返回栈中元素数目

top() 返回栈顶元素,不删除(获取)

调用时应有头文件

#include<iostream>
#include<stack>
stack<类型>x

例题 括号配对问题(一)

Description

现在有一种只包括左右小括号(“(”和“)”)和空格(” “)的字符串序列,请你判断括号是否匹配,如果匹配就输出Yes,不匹配输出No。

Input

输入数据第一行输入一个T(0≤T≤100),表示测试数据的组数。
接下来有T行测试数据,每行有一个符合题意的字符串,字符串长度不超过500。

Output

每组测试数据,先输出一个”Case %d:“,%d表示第几组测试数据。接着,如果字符串括号匹配,输出Yes,否则,输出No。具体输出格式参考下面输出样例。

Sample Input

2
( ())
)(

Sample Output

Case 1:Yes
Case 2:No

#include<iostream>
#include<stack>
#include<cstdio>
#include<cstring>
using namespace std;
int main()
{
    int t,l,i,j;
    char a[500];
    scanf("%d",&t);
    getchar();
    j=1;
    while(t--)
    {
        gets(a);
        l=strlen(a);
        stack<char>y;
        for(i=0;i<l;i++)
        {
        	if(a[i]=='(')
         	y.push(a[i]);//入栈
          	if(a[i]==')')
           	{
            		if(y.empty())
             		{
              			break;
              		}
                	else
                	y.pop();
           	 }
        }
        if(y.empty()&&i>=l)
            printf("Case %d:Yes\n",j);
        else
            printf("Case %d:No\n",j);
        j++;
    }
    return 0;
}