• 栈浅谈(上)


    目录

    栈的定义

    栈的实现 

    初始化

    判断栈是否为空

     入栈操作

    获取栈顶元素

    出栈操作

    遍历栈

    销毁栈

    完整代码演示

    栈—STL 

    基本操作

    例题

    参考代码


    栈的定义

            说到栈,一些不会计算机语言的“小白”(我就是)就会想到栈道之类的词语,我们这里的栈指的是一种计算术语,它是一类数据结构。为什么叫栈呢?(你去问图灵)因为只不过这种数据结构的“外形”和栅栏(栈)有“一”点相似罢了。

            栈其实是一种运算受限的线性表。一种被限定仅在表尾进行插入和删除操作的线性表。只准插入或删除的一端叫做栈顶,而另一端叫做栈底。当一个新的元素放到栈中我们可以把它称为入栈,进栈或压栈,刚刚进去的元素我们把它叫做栈顶元素(注意:只有一个栈最顶端的元素才能被称作栈顶元素)。当栈中的一个元素出去时我们把它称为出栈或退栈(注意:出栈的时候只能栈顶元素出栈)它是把栈顶元素删掉,把与其相邻的元素当做栈顶元素。 是不是有点蒙,画个图你就知道了。

             如果还有点蒙的话,打个比方,栈就像是一个弹夹,将里面放子弹就相当于是进栈,出栈就相当于弹出子弹,先进后出(以后我会再次更新一篇关于队列的博文,队列是先进先出)。

    接下来我们再来演示一遍出栈

    栈的实现 

    初始化

    1. void Initstack(){
    2. top=-1;
    3. }

    判断栈是否为空

    1. bool Empty(){
    2. if(top==-1){
    3. return true;
    4. }else{
    5. return false;
    6. }
    7. }//判空函数

     入栈操作

    1. void Push(int s, int x){
    2. if(top==MaxSize-1){
    3. cout<<"栈满"<
    4. return;
    5. }
    6. top++;
    7. }
    8. //入栈操作

    获取栈顶元素

    1. int Top(){
    2. if(top==-1){
    3. cout<<"栈空"<
    4. return -1;
    5. }else{
    6. return top;
    7. }
    8. }//读取栈顶元素

    出栈操作

    1. void Pop(){
    2. if(top==-1){
    3. cout<<"栈空"<
    4. return;
    5. }
    6. top--;
    7. }//出栈操作

    遍历栈

    1. void PrintStack(){
    2. while(top!=-1){
    3. top--;
    4. cout<" ";
    5. }
    6. cout<
    7. }//遍历栈

    销毁栈

    1. void DestroyStack(){
    2. top=-1;
    3. }销毁栈

    完整代码演示

    1. #include
    2. using namespace std;
    3. void Initstack(){
    4. top=-1;
    5. }//初始化
    6. bool Empty(){
    7. if(top==-1){
    8. return true;
    9. }else{
    10. return false;
    11. }
    12. }//判空函数
    13. void Push(int s, int x){
    14. if(top==MaxSize-1){
    15. cout<<"栈满"<
    16. return;
    17. }
    18. top++;
    19. }//入栈操作
    20. int Top(){
    21. if(top==-1){
    22. cout<<"栈空"<
    23. return -1;
    24. }else{
    25. return top;
    26. }
    27. }//读取栈顶元素
    28. void Pop(){
    29. if(top==-1){
    30. cout<<"栈空"<
    31. return;
    32. }
    33. top--;
    34. }//出栈操作
    35. void PrintStack(){
    36. while(top!=-1){
    37. top--;
    38. cout<" ";
    39. }
    40. cout<
    41. }//遍历栈
    42. void DestroyStack(){
    43. top=-1;
    44. }//销毁栈
    45. int main(){
    46. ios::sync_with_stdio(false);
    47. return 0;
    48. }

    其实栈还有另外的表达方式——STL闪亮登场

    标准模板库(Standard Template Library,STL)是惠普实验室开发的一系列软件的统称。它是由Alexander Stepanov、Meng Lee和David R Musser在惠普实验室工作时所开发出来的。虽说它主要出现到C++中,但在被引入C++之前该技术就已经存在了很长时间。STL的代码从广义上讲分为三类:algorithm(算法)、container(容器)和iterator(迭代器),几乎所有的代码都采用了模板类和模板函数的方式,这相比于传统的由函数和类组成的库来说提供了更好的代码重用机会。标准模板库是一个C++软件库,大量影响了C++标准程序库但并非是其的一部分。其中包含4个组件,分别为算法、容器、函数、迭代器。(源自百度百科)

    栈—STL 

    STL模板里关于栈的函数均已在上面呈现

    Tip:在使用STL栈模板的时候要先创建:

    1. #include//头文件
    2. stack<int>s1;//入栈元素为 int 型
    3. stacks2;//入队元素为string型
    4. stacks3;//入队元素为自定义型

    基本操作

    1. push(x);//将x加入栈中,即入栈操作
    2. pop();//出栈操作(删除栈顶),只是出栈,没有返回值
    3. top();//返回第一个元素(栈顶元素)
    4. size();//返回栈中的元素个数
    5. empty();//当栈为空时,返回 true

    例题

    详见P1739 表达式括号匹配 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)

    参考代码

    1. #include
    2. #include
    3. #define llu unsigned long long
    4. stack <char> s;
    5. using namespace std;
    6. int main(){
    7. char s1[105];
    8. while(cin>>s1&&s1!=0){
    9. int n=strlen(s1);
    10. for(int i=0;i
    11. if(s1[i]=='('||s1[i]=='['||s1[i]=='{') s.push(s1[i]);
    12. else if(s1[i]==')'||s1[i]==']'||s1[i]=='}'){
    13. if(s.empty())s.push(s1[i]);
    14. else if(s1[i]==')'&&s.top()=='(') s.pop();
    15. else if(s1[i]==']'&&s.top()=='[') s.pop();
    16. else if(s1[i]=='}'&&s.top()=='{') s.pop();
    17. else s.push(s1[i]);
    18. }
    19. }
    20. if(s.empty())cout<<"yes"<
    21. else cout<<"no"<
    22. }
    23. return 0;
    24. }

    今天对于栈的讲解到此结束,我们下一篇博文再见!!!

  • 相关阅读:
    【MySQL】为什么使用B+树做索引
    如何让Java的线程池顺序执行任务?
    教你安装Stanford NLP
    Java测试、反射、注解
    汽车电子行业入门指南「知识体系」
    4K壁纸小程序源码 全内容自动采集
    Vuex从了解到实际运用(二),获取vuex中的全局状态(state,getters)
    Java框架 SpringMVC--域对象共享数据
    欧奈尔RPS曲线的编制方法这次终于成功了
    SpringBoot集成图数据库neo4j实现简单的关联图谱
  • 原文地址:https://blog.csdn.net/cyyyyds857/article/details/128056262