160508 栈和队列

来源:互联网 发布:2008年雪灾知乎 编辑:程序博客网 时间:2024/06/06 11:04

栈和队列

基本操作

#include <iostream>  #include <stack>  using namespace std;  int main()  {      stack <int> s;//定义栈      s.push(5);//压栈      s.push(6);      s.push(7);  s.pop(); //出栈  printf(“栈顶元素:%d\n”,s.top());    return 0;  }    

队列

头文件:

#include <queue>using namespace std;

声明方法:

1、普通声明

queue<int>q;

2、结构体

struct node{        int x, y;    };   queue<node>q;
  Stl队列的基本操作:

q.push(x) 将x压入队列的末端
q.pop() 弹出队列的第一个元素(队顶元素),注意此函数并不返回任何值
q.front() 返回第一个元素(队顶元素)
q.back() 返回最后被压入的元素(队尾元素)
q.empty() 当队列为空时,返回true
q.size() 返回队列的长度

题目

codevs2058 括号序列

定义满足以下规则字符串为规则序列,否则不是规则序列:
1.空序列是规则序列;
2.如果S是规则序列,那么(S),[S],{S}和< s>也是规则序列;
3.如果A和B都是规则序列,那么AB也是规则序列。
例如,下面的字符串都是规则序列:
(),[],(()),([]),()[],()[()],{{}}<>,([]<>{{}}),<<{}>>
而以下几个则不是:
(,[,],)(,()),([(),<<,{(}),<{}>)
现在,给你一些由”(“、”)”、”[“、”]”、”{“、”}”、”<”、”>”构成的字符串,请判断该字符串是否为规则序列。

输入描述 Input Description

第一行:一个正整数N,表示测试数据组数;
接下来N行:每行一个括号序列(长度不超过L)。

输出描述 Output Description

共N行:对于每一个括号序列,判断其是否规则。
规则输出TRUE,否则输出FALSE。

样例输入 Sample Input

2
{()}<<>>

{{{{{}}}}

样例输出 Sample Output

TRUE
FALSE

数据范围及提示 Data Size & Hint

对于40%数据,有N=1,0

题目分析:

如果遇到左括号,入栈,如果遇到右括号,与栈顶元素比较,如果配对,栈顶元素出栈,否则失配,输出flase;
判断完成后,如果栈空正确,否则false;

代码

#include<iostream>#include<stack>#include<cstring>#include<cstdio>using namespace std;char str[2000001];int main(){    int n;    cin>>n;    for(int i=1;i<=n;i++){        stack<char>s;//定义为局部变量,每次执行函数重新定义,避免了清空         bool flag=1;        scanf("%s",str);//cin>>str;        int l;        l=strlen(str);//l=str.length();        for(int j=0;j<l;j++){            switch(str[j]){                case ')':if(!s.empty()&&s.top()=='(') s.pop();else flag=0;break;//注意先判断栈是否为空再取栈顶(弹栈)!!!                case '>':if(!s.empty()&&s.top()=='<') s.pop();else flag=0;break;                case '}':if(!s.empty()&&s.top()=='{') s.pop();else flag=0;break;                case ']':if(!s.empty()&&s.top()=='[') s.pop();else flag=0;break;                default :s.push(str[j]);break;            }        }    if(flag&&s.empty())cout<<"TRUE"<<endl;else cout<<"FALSE"<<endl;////s.empty条件 注意输出格式大小写!!!     }return 0;   }

poj3629 Card Stacking

题目描述

贝斯和奶牛们共n个队员玩k张牌,分牌时候,每轮先分给奶牛,再分给贝斯,每次将最前面的一张牌分给队员,再将这张牌后的p张牌按顺序放在最后。要求给出分完所有牌后贝斯的牌(按照从小到大排好序)。

输入

1行,n,k,p

输出

贝斯的牌(用回车分隔)

样例输入

3 9 2

样例输出

3
7
8

题目分析:

队列模拟

代码

#include<iostream>#include<queue>#include<algorithm>using namespace std;int q[100005],head=0,tail=0;int main(){    int n,m,p;     cin>>n>>m>>p;    for(int i=1;i<=m;i++){        q[tail]=i;tail++;    }    int f=0;    int bs[m/n+1],l=0;    while(head!=tail){        f++;f%=n;        if(!f)bs[++l]=q[head];        head++;head%=100003;        for(int i=1;i<=p;i++){            q[tail]=q[head];tail++;tail%=100003;head++;head%=100003;            }    }    sort(bs,bs+l);    for(int i=1;i<=l;i++)cout<<bs[i]<<endl;} 
0 0
原创粉丝点击