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应用相关推荐

  1. STL stack 容器

    STL stack 容器 Stack简介 stack是堆栈容器,是一种"先进后出"的容器.       stack是简单地装饰deque容器而成为另外的一种容器.       #i ...

  2. c++ stl stack(FILO,容器配接器)

    1.stack stack是一种先进后出的数据结构,它只有一个出口.stack允许新增元素.移除元素.取得最顶元素.但除了最顶端外,没有任何其他方法可以存取stack的其他元素.换言之,stack不允 ...

  3. 牛客网 2018年全国多校算法寒假训练营练习比赛(第二场) A.吐泡泡-STL(stack)

    不好玩,一堆板子,太菜了,被打爆了,B一直wa60%,D一直wa80%,D改了多组输入就过了... A.吐泡泡 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32768K,其他语言6 ...

  4. STL——stack

    一.stack介绍和使用 1.stack文档介绍 (1)stack是一种容器适配器,专门用于具有后进先出操作的上下文环境中,其只能从容器的一端进行元素的插入与删除,以及提取操作. (2)stack是作 ...

  5. STL stack 栈(后进先出)

    #include<iostream> #include<cstdio> #include<stack> using namespace std; int main( ...

  6. [C++STL]stack容器用法介绍

  7. C++ STL栈Stack的使用

    C++ STL stack 用法 Stack(栈)是一种后进先出的数据结构,也就是LIFO(last in first out) ,最后加入栈的元素将最先被取出来,在栈的同一端进行数据的插入与取出,这 ...

  8. C++(STL):25 ---序列式容器stack源码剖析

    一.stack概述 stack是一种先进后出(First In Last Out,FILO)的数据结构.它只有一个出口, 形式如下图所示 特点: stack允许新增元素.移除元素.取得最顶端元素.但除 ...

  9. c++ stl stack_C ++ STL中的stack :: top()函数

    c++ stl stack Prototype: 原型: stack<T> st; //declaration T st.top(); Parameter: 参数: No paramete ...

  10. c++ stl stack_C ++ STL中的stack :: push()函数

    c++ stl stack Prototype: 原型: stackst; //declaration st.push(T item); Parameter: 参数: T item; //T is t ...

最新文章

  1. 完整的Blender三维课程:素描到三维艺术的初学者
  2. 007_JavaScript关键字和保留字
  3. D3D API - D3DTA_TEMP
  4. 自百度2012吧——这些都是巧合吗
  5. XML与JavaBean相互转换工具
  6. 单链表逆置 java_单链表的就地逆置--java实现(含头节点和不包含头节点)
  7. 熊顿 - 滚蛋吧!肿瘤君(2013年4月22日)
  8. ASP.NET MVC中的统一化自定义异常处理
  9. cuda event
  10. hdu 1024(dp)
  11. 【leetcode】20. Valid Parentheses
  12. js 实现pdf在线阅读
  13. C语言 #define ABS(X) (X >= 0) ? X : -X 遇到的逻辑错误
  14. Word操作之图表目录自动生成
  15. 为什么csgo一直显示连接官方服务器失败,CSGO提示连接任意官方服务器失败怎么办?五大详细解决方法看这里!...
  16. Bill Gates和Elon Musk推荐,人工智能必读的三本书 -《终极算法》,《超级智能》和《终极发明》
  17. c语言移动光标到指定坐标,C语言实现光标移动
  18. 英语学习资料下载大全
  19. 第九届蓝桥杯省赛JAVA语言 C组题解_题7 缩位求和
  20. 微信小程序开发之微信支付(四)组合签名(时间戳,随机串) 用户确认支付

热门文章

  1. PL/SQL编程:loop-if-exit-end循环算5的阶乘
  2. 软件体系结构风格(第5-8课时)
  3. 在web.xml文件中配置Servlet时,主要配置哪些信息?
  4. 作为一名合格的前端开发工程师需要会哪些
  5. linux哪些文件被更新,Linux:如何確定文件是否已被其他進程更新?
  6. spring data jpa 详解
  7. 杨老师课堂_Java核心技术下之控制台模拟记事本案例...
  8. 创业思维 - Qunar的故事
  9. MYSQL忘记登录密码
  10. Android监听HOME按键