【ACM】【STL】stack应用
C++ Stacks(堆栈)
C++ Stack(堆栈) 是一个容器类的改编,为程序员提供了堆栈的全部功能,——也就是说实现了一个先进后出(FILO)的数据结构。
操作 | 比较和分配堆栈 |
empty() | 堆栈为空则返回真 |
pop() | 移除栈顶元素 |
push() | 在栈顶增加元素 |
size() | 返回栈中元素数目 |
top() | 返回栈顶元素 |
现学现用:
一、POJ 1363 Rails
http://poj.org/problem?id=1363
应用stack,本题还需要注意输入格式,输出格式。
题目大意:给你一个出栈顺序,判断这个出栈顺序是否合法。先将出栈顺序保存在数组output中,然后按照顺序进栈,让目前这个进栈的数和与正在指向的那个output数组里的数相同时,则说明这个进栈的数是要出栈的,所以input.pop(),当所有的数都都按照顺序放在stack中,即i==n时,结束循环之前i++,则推出了循环,这时如果k==n 或者 栈为空,都可以作为判断条件
#include <iostream>
#include <cstdio>
#include <stack>
using namespace std;
int output[1000+5];
int main()
{int n,i,k;while(scanf("%d",&n) && n){while(scanf("%d",&output[0]) && output[0])//b数组用来储存出栈顺序{for(i=1;i<n;i++)scanf("%d",&output[i]);stack<int> input;i=1;//赋值k=0;while(i<=n){input.push(i);//表示进栈while(input.top()==output[k])//当目前进栈的元素等于要出栈的元素时,则表示,该元素出栈,从input数组里去掉{if(!input.empty()) input.pop();k++;if(input.empty()) break;//全部出栈}i++;//这里的j++表示新的进栈元素的下标是刚出栈元素的下标,新的进栈元素就是i++之后的。}if(k==n)//if(input.empty())printf("Yes\n");elseprintf("No\n");}printf("\n");}return 0;
}
还有不利用stack,直接用两个数组进行模拟
#include <iostream>
#include <cstdio>
using namespace std;
int output[1000+10],input[1000+10];
int main()
{int n,i,j,k;while(scanf("%d",&n) && n){while(scanf("%d",&output[0]) && output[0])//b数组用来储存出栈顺序{for(i=1;i<n;i++)scanf("%d",&output[i]);i=1;j=0;k=0;while(i<=n && j<n){input[j]=i;//表示进栈while(input[j]==output[k])//当目前进栈的元素等于要出栈的元素时,则表示,该元素出栈,从input数组里去掉{j--;k++;if(j==-1) break;//全部出栈}i++;j++;//这里的j++表示新的进栈元素的下标是刚出栈元素的下标,新的进栈元素就是i++之后的。}if(k==n)printf("Yes\n");elseprintf("No\n");}printf("\n");}return 0;
}
二、Text Reverse
http://acm.hdu.edu.cn/showproblem.php?pid=1062
遇到空格,就输出栈里的内容,可能存在又两个空格的情况,所以中间的continue要特别注意
#include <iostream>
#include <cstdio>
#include <stack>
#include <cstring>
using namespace std;
int output[1000+5];
int main()
{int i,T,len;char str[1010];stack<char> s;cin >>T;getchar();while(T--){i=0;memset(str,0,sizeof(str));gets(str);while(str[i]){if(str[i]==' '){while(!s.empty()){printf("%c",s.top());s.pop();}printf(" ");i++;continue;}s.push(str[i]);i++;}while(!s.empty()){printf("%c",s.top());s.pop();}printf("\n");}return 0;
}
还有另外一种做法,用到一个函数strrev()
#include<stdio.h>
#include<string.h>
int main()
{int t;scanf("%d\n",&t);while(t--){char s[1005]={};while(scanf("%[^ \n]",s)!=EOF){printf("%s",strrev(s));s[0]=0;putchar(getchar());}}return 0;
}
如果:
scanf("%[^ \n]",s)
换成
scanf("%[^\n]",s)
则是一整行进行反转
三、Train Problem I
http://acm.hdu.edu.cn/showproblem.php?pid=1022
和第一题不一样的地方在于在判断满足条件以后,需要把火车进站出站的顺序写出来,所以第一个stack用来判断是否满足条件,第二次右重新来一遍,来输出in 和 out 。(这只是我的方法,如果大家有更好的方法,希望大家能够评论,一起探讨)
#include <iostream>
#include <set>
#include <cstdio>
#include <string>
#include <map>
#include <queue>
#include <stack>
#include <algorithm>
#include <sstream>
typedef long long ll;
using namespace std;int main ()
{string in,out;int N;while(scanf("%d",&N)!=EOF){cin >> in >> out;stack<char> s1,s2;int i,j;i=0;j=0;while(i<in.length()){s1.push(in[i]);while(s1.top()==out[j]){s1.pop();j++;if(s1.empty())break;}i++;}if(j==out.length())cout << "Yes.\n";else{cout << "No.\nFINISH\n";continue;}i=0;j=0;while(i<in.length()){s2.push(in[i]);cout << "in\n";while(s2.top()==out[j]){s2.pop();cout << "out\n";j++;if(s2.empty())break;}i++;}cout << "FINISH\n";}return 0;
}
暂时只找到这三个题,之后有发现会继续补充,大家也可以在评论中推荐! :)
【ACM】【STL】stack应用相关推荐
- STL stack 容器
STL stack 容器 Stack简介 stack是堆栈容器,是一种"先进后出"的容器. stack是简单地装饰deque容器而成为另外的一种容器. #i ...
- c++ stl stack(FILO,容器配接器)
1.stack stack是一种先进后出的数据结构,它只有一个出口.stack允许新增元素.移除元素.取得最顶元素.但除了最顶端外,没有任何其他方法可以存取stack的其他元素.换言之,stack不允 ...
- 牛客网 2018年全国多校算法寒假训练营练习比赛(第二场) A.吐泡泡-STL(stack)
不好玩,一堆板子,太菜了,被打爆了,B一直wa60%,D一直wa80%,D改了多组输入就过了... A.吐泡泡 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32768K,其他语言6 ...
- STL——stack
一.stack介绍和使用 1.stack文档介绍 (1)stack是一种容器适配器,专门用于具有后进先出操作的上下文环境中,其只能从容器的一端进行元素的插入与删除,以及提取操作. (2)stack是作 ...
- STL stack 栈(后进先出)
#include<iostream> #include<cstdio> #include<stack> using namespace std; int main( ...
- [C++STL]stack容器用法介绍
- C++ STL栈Stack的使用
C++ STL stack 用法 Stack(栈)是一种后进先出的数据结构,也就是LIFO(last in first out) ,最后加入栈的元素将最先被取出来,在栈的同一端进行数据的插入与取出,这 ...
- C++(STL):25 ---序列式容器stack源码剖析
一.stack概述 stack是一种先进后出(First In Last Out,FILO)的数据结构.它只有一个出口, 形式如下图所示 特点: stack允许新增元素.移除元素.取得最顶端元素.但除 ...
- c++ stl stack_C ++ STL中的stack :: top()函数
c++ stl stack Prototype: 原型: stack<T> st; //declaration T st.top(); Parameter: 参数: No paramete ...
- c++ stl stack_C ++ STL中的stack :: push()函数
c++ stl stack Prototype: 原型: stackst; //declaration st.push(T item); Parameter: 参数: T item; //T is t ...
最新文章
- 完整的Blender三维课程:素描到三维艺术的初学者
- 007_JavaScript关键字和保留字
- D3D API - D3DTA_TEMP
- 自百度2012吧——这些都是巧合吗
- XML与JavaBean相互转换工具
- 单链表逆置 java_单链表的就地逆置--java实现(含头节点和不包含头节点)
- 熊顿 - 滚蛋吧!肿瘤君(2013年4月22日)
- ASP.NET MVC中的统一化自定义异常处理
- cuda event
- hdu 1024(dp)
- 【leetcode】20. Valid Parentheses
- js 实现pdf在线阅读
- C语言 #define ABS(X) (X >= 0) ? X : -X 遇到的逻辑错误
- Word操作之图表目录自动生成
- 为什么csgo一直显示连接官方服务器失败,CSGO提示连接任意官方服务器失败怎么办?五大详细解决方法看这里!...
- Bill Gates和Elon Musk推荐,人工智能必读的三本书 -《终极算法》,《超级智能》和《终极发明》
- c语言移动光标到指定坐标,C语言实现光标移动
- 英语学习资料下载大全
- 第九届蓝桥杯省赛JAVA语言 C组题解_题7 缩位求和
- 微信小程序开发之微信支付(四)组合签名(时间戳,随机串) 用户确认支付