C++ 数据结构之栈

栈作为最常用的数据结构之一,一直是算法竞赛中最基础的的内容,但是它和递归一起算是初学者的噩梦,我在此也就秉着复习知识加造福新人的初衷,写一篇关于栈的基础详解。

栈也叫后进先出表,LIFO表,其实可以想象成一摞书,先搁上去的会被压在最底下,而最上面的书却是最后摞上去的。

这样讲还是比较抽象,我这里附图解释吧:

  首先原始的栈中元素从下至上为“2,7,1”,而执行“压入8”之后最上层多了一个元素“8”,而后的push(2)则同理。执行pop()会弹出最上层的元素,执行三次后栈中元素还剩下“2,7”。

为了让大家更好的理解,这里附上手写栈的代码。

#include <bits/stdc++.h>
using namespace std;

int n, top = 0;
int a[105];
int Do[105];

int Top()//返回栈顶元素
{
    return a[top - 1];
}

void pop()//弹栈
{
    if (top > 0)
        a[top] = 0;
}

void push(int x)//压栈
{
    a[top] = x;
    top++;
}

int main()
{
    cin >> n;
    for (int i = 1; i <= n; i++)
        cin >> Do[i];//操作命令数组
    for (int i = 1; i <= n; i++)
    {
        if (Do[i] == 1)//1压2弹
            push(i);
        else
            if (top > 0) pop();//栈非空才弹,否则错误
            else cout << "Error";
    }
    cout << Top();//输出栈顶
}

这只是个“婴幼儿版本”的手写栈,目的只是便于理解罢了,漏洞还是很多的,比如没有判空函数,而是用一个假指针来判断等等,权当做一个理解工具罢了,实际上做题时一般会使用头函数<stack>中的自带栈。

下面上几道题来辅助理解。

Codevs 2058 括号序列

  样例输入

2
  {()}<<>>
  {{{{{}}}}

  样例输出

TRUE

FALSE

这是道很经典的栈题,只需要用数组模拟栈就行,把左括号压栈,如果匹配到右括号就弹,若空则合法。

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<cstring>
using namespace std;

char s[2000001],a[2000001];
int top=0;
int i,j,n;

int main()
{
    cin>>n;
    for( i = 1; i <= n; i++)
    {
        bool f = 1;
        cin >> s;
        int l = strlen(s);
        for(j = 0; j < l; j++)
        {
            if(s[j]==‘(‘||s[j]==‘{‘||s[j]==‘[‘||s[j]==‘<‘)
            {
                top++;
                a[top]=s[j];
            }
            else
                if((s[j]==‘)‘)&&(a[top]==‘(‘)&&(top>0))
                    top--;
                else
                    if(s[j]==‘]‘&&a[top]==‘[‘&&top>0)
                        top--;
                    else
                        if(s[j]==‘>‘&&a[top]==‘<‘&&top>0)
                            top--;
                        else
                            if(s[j]==‘}‘&&a[top]==‘{‘&&top>0)
                                top--;
                            else
                            {
                                f=0;
                                break;
                            }

        }
    if(f==0)
        cout<<"FALSE"<<endl;
    else
        if(top>0)
            cout<<"FALSE"<<endl;
        else
            cout<<"TRUE"<<endl;
        top=0;
    }
    return 0;
}

Codevs 2821 天使之城

一样利用栈来模拟暂停站区,常规进行压弹栈操作就好。

#include <bits/stdc++.h>
using namespace std;

int p = 1;
int n, cnt;
int ans[105];
char a[105];
stack<int>s;

int main()
{
    scanf("%d", &n);
    scanf("%s", a+1);
    for (int i = 1; i <= n; i++)
    {
        if (a[i] == ‘A‘)
        {
            ans[p] = p;
            p++;
            continue;
        }
        else if (a[i] == ‘B‘)
        {
            s.push(i);
            cnt++;
            if (cnt > 5)
            {
                cout << "No";
                return 0;
            }
            continue;
        }
        else if (a[i] == ‘C‘)
        {
            if (s.empty() == 1)
            {
                cout << "No";
                return 0;
            }
            else
            {
                ans[p] = s.top();
                p++;
                s.pop();
                cnt--;
            }
            continue;
        }
    }
    cout << "Yes\n";
    for (int i = 1; i < p; i++)
        cout << ans[i] << endl;
    return 0;
}

暂时就写这么多吧,日后会更新

时间: 2024-11-09 00:20:28

C++ 数据结构之栈的相关文章

数据结构之栈与队列

数据结构的有一个重要结构栈,栈这种数据结构就是满足先进后出的这种规则的数据结构就是栈,引用<大话数据结构>中的一个形象例子就是,子弹的弹夹,最先压入弹夹的子弹最后一个出弹夹,正好往一个栈里添加一个元素叫压栈.入栈,从栈里出来一个元素叫弹栈,出栈.指示器就叫栈帧. 栈图 现在就贴上代码: 栈的几个基本操作: #include<stdio.h> #include<stdlib.h> #include<string.h> typedef struct node{

数据结构之栈定义及基本操作实现

终于有可以有时间写点数据结构的学习总结了,前段时间一直在紧张的忙一些项目,都没有空出时间来学习数据结构,现在终于可以稍微喘口气了,还是数据结构有意思,这两天看了点栈的东西,写下来总结一下,有错误的地方希望看到的朋友指出来,感激不尽. 根据学习,栈就是一种线性数据结构,栈的运算只能在表的一段进行,所以这种数据结构具有“后进先出”的特点. 接下来是栈的c语言实现.其中栈由一个top节点和bottom节点组成,这两个节点分别指向栈的顶部和底部.其中栈的组成结点是由结构体实现,结构体由数据库和指向下一个

【数据结构】栈和队列

栈和队列 容器数据结构是指一些包含了若干个其他相同或不同的数据结构的数据结构,被包含的这些每一个独立的数据结构都被称为一个元素,在一个容器中的元素往往支持相同的操作,具有类似的性质.之前说到过的线性表其实就是一种容器数据结构,本文中介绍的两种最常用的容器数据结构是栈和队列. 从功能上看,栈和队列大多用于计算过程中保存临时数据,这些数据是在计算过程中发现或产生的.在而后的计算中可能会用到这些数据.如果这些数据是固定的个数以及大小的话,可以构建几个变量来储存它们,但是如果这些数据不确定的话,就需要一

简单数据结构之栈模拟

1 /************************************************************************************** 2 * Function : 模拟栈 3 * Create Date : 2014/04/23 4 * Author : NTSK13 5 * Email : [email protected] 6 * Copyright : 欢迎大家和我一起交流学习,转载请保持源文件的完整性. 7 * 任何单位和个人不经本人允许不得

Java数据结构之栈

package com.xingej.algorithm.datastructure.stack; /**  * 数据结构之栈Stack  *   * 以long类型为测试用例  *   * @author erjun 2017年12月4日 下午10:22:34  */ public class LongStack {     // 底层数据存储     private long[] arr; // 最大元素数量     private int maxSize; // 当前元素的指针     p

数据结构 - 链栈的实行(C语言)

数据结构-链栈的实现 1 链栈的定义 现在来看看栈的链式存储结构,简称为链栈. 想想看栈只是栈顶来做插入和删除操作,栈顶放在链表的头部还是尾部呢?由于单链表有头指针,而栈顶指针也是必须的,那干吗不让它俩合二为一呢,所以比较好的办法是把栈顶放在单链表的头部(如下图所示).另外,都已经有了栈顶在头部了,单链表中比较常用的头结点也就失去了意义,通常对于链栈来说,是不需要头结点的. 对于空栈来说,链表原定义是头指针指向空,那么链栈的空其实就是 top=NULL 的时候. 链栈的结构代码如下: /* 链栈

数据结构 - 顺序栈的实行(C语言)

数据结构-顺序栈的实现 1 顺序栈的定义 既然栈是线性表的特例,那么栈的顺序存储其实也是线性表顺序存储的简化,我们简称为顺序栈.线性表是用数组来实现的,对于栈这种只能一头插入删除的线性表来说,用数组哪一端来作为栈顶和栈底比较好? 对,没错,下标为0的一端作为栈底比较好,因为首元素都存在栈底,变化最小,所以让它作栈底. 我们定义一个top变量来指示栈顶元素在数组中的位置,这top就如同中学物理学过的游标卡尺的游标,它可以来回移动,意味着栈顶的top可以变大变小,但无论如何游标不能超出尺的长度.同理

二、数据结构之栈、队列、循环队列

二.数据结构之栈.队列.循环队列 顺序栈 Stack.h 结构类型,函数声明: #ifndef _STACK_H_ #define _STACK_H_ typedef int SElementType; ///顺序栈 #define STACK_INIT_SIZE 20 #define STACK_INCREMENT 10 typedef struct { SElementType * base; SElementType * top; int stackSize;///当前栈的大小 }SqSt

数据结构之栈的简单应用(判断字符串中括号的合法性)

数据结构之栈(判断字符串中括号的合法性) 栈的定义 栈是一种线性数据结构,栈的特征是数据的插入和删除只能通过一端来实现,这一端称为"栈顶",相应的另一端称为"栈底":另外其还有先进后出,后进先出的特征. 栈是一种高效的数据结构,因为数据只能在栈的顶端添加或者删除,所以这样的操作很快而且容易实现. 说到线性结构,得先了解一下数据的逻辑结构,数据的逻辑结构分为线性结构.集合结构.树形结构和图形结构,如下图所示,栈是一种特殊的线性表,是线性结构的一种. JavaScrip

[数据结构]单调栈的基本应用2

[数据结构]单调栈的基本应用2 一.前言 单调栈的基本应用2是单调栈的基本应用1的延伸.应用2主要解决的是二维平面的一些问题. 二.基本应用2 虽然已经应用到二维平面,但是单调栈的思想并没有变化 更多应用的是延伸的位置.本质是ai的左/右第一个大于ai的元素位置 下面列举的一些平面内单调栈的例题: 例1: POJ2559 最大矩形面积 题目描述: 给定n个依次排列并且面积为1*hi的矩形,现求这个图形所包含最大的矩形的面积. 上图中7个矩形的h依次为2 1 4 5 1 3 3.注意题目有多组数据