栈学习笔记

  • 栈是特殊的链表,只能在表尾进行插入(push)和删除(pop),具有后进先出的特点(LIFO)
  • 链表分为动态链表和表态链表。动态链表是根据需要给栈元素分配存储空间,而静态链表则是固定存储空间的。
  • C++ STL(Standard Template Library, 即标准模板库) 定义了栈的基本操作, 需要包含<stack>头文件。示例代码如图1-1所示。
  • #include <iostream>
    #include <stack>
    using namespace std;
    int main()
    {
        stack<int>s; //声明栈s的元素类似是int
        s.empty()    //栈空,返回true, 否则返回false
        s.push(1);   //1进栈
        s.top();     //取栈顶元素
        s.pop();     //栈顶元素出栈
        return 0;
    }

    图1-1    标准模板库stack的使用示例

  • 规模确定的情况下,可以使用数组来存储栈。示例代码如图1-2所示。
  • #include <iostream>
    #include <stack>
    using namespace std;
    int main()
    {
        int stk[1000], top=0;
       top = 0;          //栈空
        stk[++top] = 1;   //1进栈
        stk[-- top];      //取栈顶元素
        top--;            //出栈
        return 0;
    }

    图1-2    用数组实现简单的栈

  • 与栈相关的编程练习,TOJ 1196 Web Navigation 和 TOJ 1036 Rails。 其中前者是模拟上网访问(visit)网页的前进(FORWARD)和后退(BACK),后者是模拟火车进入“死胡同”后出站的顺序。前者可以用两个栈,一个保存前进的网页URL,一个保存后退的URL。火车车厢进“死胡同”,后进的车厢先出。这两道题是比较古老但经典的与栈相关的题目。这两道题的相应代码分别如图1-3、图1-4所示。
  • #include <iostream>
    #include <stack>
    #include <string>
    using namespace std;
    int main()
    {
        string cmd, visit = "http://www.acm.org/";
        stack<string>Forward, Back;
        while(cin>>cmd && cmd != "QUIT")
        {
            if(cmd == "VISIT")
            {
                Back.push(visit);
                while(!Forward.empty())
                    Forward.pop();
                cin>>visit;
            }
            else if(cmd == "FORWARD")
            {
                if(Forward.empty())
                {
                    cout<<"Ignored"<<endl;
                    continue;
                }
                else
                {
                    Back.push(visit);
                    visit = Forward.top();
                    Forward.pop();
                }
            }
            else if(cmd == "BACK")
            {
                if(Back.empty())
                {
                    cout<<"Ignored"<<endl;
                    continue;
                }
                else
                {
                    Forward.push(visit);
                    visit = Back.top();
                    Back.pop();
                }
            }
            else
                printf("Invalid input!\n");
            cout<<visit<<endl;
        }
        return 0;
    }

    图1-3    TOJ1196 Web Navigation的参考代码

  • #include <stdio.h>
    #include <stdlib.h>
    #include <stack>
    using namespace std;
    int main()
    {
        stack<int>s;
        int n, i, j;
        while(scanf("%d", &n) && n)
        {
            //init block
            int a[n];
          while(scanf("%d", &a[0]) && a[0])
         {
            for(i=1; i<n; i++)
            {
                scanf("%d", &a[i]);
            }
            //judge
            j = 1, i=0;
            while(!s.empty())
                s.pop();
            while(i < n)
            {
                //push j  when j<=a[i]
                while(j <= a[i])
                {
                    s.push(j);
                    j++;
                }
                //pop s.top if s.top() == a[i]
                while(!s.empty() && s.top() == a[i])
                {
                    s.pop();
                    i++;
                }
                //根据LIFO, s.top()永远应该<=a[i]
                if(!s.empty() && s.top()>a[i])
                    break;
            }
            if(s.empty())
                printf("Yes\n");
            else
                printf("No\n");
          }
          printf("\n");
        }
        return 0;
    }

    图1-4    TOJ 1036 Rails 的参考代码

时间: 2024-12-28 17:35:58

栈学习笔记的相关文章

数据结构 栈 学习笔记1

//SeqStack.h typedef struct stack { DATA data[SIZE+1];  //数据元素  int top;  //栈顶  }SeqStack; SeqStack *SeqStackInit() { SeqStack *p; if(p=(SeqStack *)(malloc)(sizeof(SeqStack)))  //申请栈内存  { p->top = 0; //设置栈顶为零  return p; //返回指向栈的指针  } return NULL; } i

栈学习笔记2

//SeqStack.h typedef struct stack { DATA data[SIZE+1];  //数据元素  int top;  //栈顶  }SeqStack; SeqStack *SeqStackInit() { SeqStack *p; if(p=(SeqStack *)(malloc)(sizeof(SeqStack)))  //申请栈内存  { p->top = 0; //设置栈顶为零  return p; //返回指向栈的指针  } return NULL; } i

数据结构栈 学习笔记

栈是先进后出的数据结构. 下面直接上代码了.下面使用数据模仿栈式结构. // // main.cpp // StudyC++ // // Created by 杜甲 on 14-9-12. // Copyright (c) 2014年 杜甲. All rights reserved. // #include <iostream> //std::cout #include <stdio.h> using namespace std; #define MaxSize 10 int st

[原创]java WEB学习笔记59:Struts2学习之路---OGNL,值栈,读取对象栈中的对象的属性,读取 Context Map 里的对象的属性,调用字段和方法,数组,list,map

本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱好者,互联网技术发烧友 微博:伊直都在0221 QQ:951226918 -----------------------------------------------------------------------------------------------------------------

java之jvm学习笔记六-十二(实践写自己的安全管理器)(jar包的代码认证和签名) (实践对jar包的代码签名) (策略文件)(策略和保护域) (访问控制器) (访问控制器的栈校验机制) (jvm基本结构)

java之jvm学习笔记六(实践写自己的安全管理器) 安全管理器SecurityManager里设计的内容实在是非常的庞大,它的核心方法就是checkPerssiom这个方法里又调用 AccessController的checkPerssiom方法,访问控制器AccessController的栈检查机制又遍历整个 PerssiomCollection来判断具体拥有什么权限一旦发现栈中一个权限不允许的时候抛出异常否则简单的返回,这个过程实际上比我的描述要复杂 得多,这里我只是简单的一句带过,因为这

[原创]java WEB学习笔记6:Struts2 学习之路--Struts的CRUD操作( 查看 / 删除/ 添加) 使用 paramsPrepareParamsStack 重构代码 ,PrepareInterceptor拦截器,paramsPrepareParamsStack 拦截器栈

本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱好者,互联网技术发烧友 微博:伊直都在0221 QQ:951226918 -----------------------------------------------------------------------------------------------------------------

数据结构学习笔记之栈

栈(stack)  是限定仅在表尾进行插入或删除操作的线性表.因此,对栈来说,表尾端有其特殊含义,称为栈项(top),相应地,表头端称为栈底(bottom).不含元素的空表称为空栈. 栈有两种存储表示方法:顺序栈和链栈.顺序栈,即栈的顺序存储结构是利用一组地址连续的存储单元依次存放自栈底到栈顶的数据元素,同时附设指针top指示栈顶元素在顺序栈中的位置.通常的习惯做法是以top=0表示空栈,鉴于C语言中数组的下标约定从0开始,则当以C作描述语言时,如此设定会带来很大不便:另一方面,由于栈在使用过程

《数据结构与算法分析》学习笔记(四)——栈ADT

一.栈ADT是what? 1.定义 栈,是限制插入和删除都只能在一个位置上进行的表. 2.图示 3.栈的基本功能 (1)是否为空 (2)进栈 (3)出栈 (4)清空 (5)取栈顶 二.栈的链表实现 <数据结构与算法分析>学习笔记(四)--栈ADT

汇编入门学习笔记 (二)—— 寄存器(内存访问)、栈

疯狂的暑假学习之  汇编入门学习笔记 (二) 参考:<汇编语言> 王爽  第三章 一.寄存器(内存访问) 1.DS和[address] DS 数据段寄存器,用来存放数据段地址 [address] 用来表示数据段的偏移地址 同样跟CS一样,不可以通过 mov ds, 1000 给ds赋值 要通过通用寄存器ax等. 例如: mov ax, 1000 mov ds, ax mov al, [0] 把1000:0的内容存进al mov bx, 1000 mov ds, bx mov [0], al 把