`
追梦--
  • 浏览: 38032 次
  • 性别: Icon_minigender_1
社区版块
存档分类
最新评论

数据结构——堆栈

阅读更多
    对于栈,想必大家都十分熟悉了,也能很快的答出栈是一个先进后出的队列。但是在平常编程的生活中应用的十分少。在ACM中,栈是一种十分重要的数据结构(其他领域也一样),我们可以用这种数据结构解决一些十分棘手的问题,大大提高了程序的效率。
有这样一道名为Software BUGs 的题。题目的意思简要来说就是去除一篇文章中的所有 ”BUG” 字段。
   有些人可能认为这是一道水题,直接扫描文章,将其中的 ”BUG” 去掉就行。这样很容易就落进了陷阱。例如对于一个字符串 “ BBUBUGGG” 直接扫描过去得到 “BBUGGG” ,我们发现字符串中还有 ”BUG”(解决了一个BUG,又出现了一个BUG),他们马上又提出解决方法,我们可以将字符串扫描两遍,但是一样的会有BUG出现.......那我们扫描到不在出现BUG为止,这的确不失为一个方法,但是经过计算后我们发现这个算法的时间复杂度是O(n^2)。在数剧比较大的情况下,这是不可能在规定时间里出结果的!!!
   若我们采用堆栈这种数据结构。算法原理如下:若栈中元素小于两个或压入的字符不为’ G’,则将字符压入栈中,否则判断栈顶的两个元素是否为’B’和’U’,若不是则将’G’压入栈中,否则将栈顶的两个元素弹出。
   这样似乎没有什么区别,让我们举个例子看看,对于字符串 “BBUBUGG”,下面模拟栈中的情况。
   栈                      即将要压入的元素
                                B
   B                       B
   B B                     U
   B B U                   B
   B B U B                 U
   B B U B U               G   //符合条件,栈顶的两个元素将被弹出
   B B U                   G   //符合条件,栈顶的两个元素将被弹出
   B                       G
   B G
   所以最后的答案就是BG,不管嵌套多少层,这个数据结构都能以O(n)的时间复杂度计算出答案,下面贴出c++代码

#include<iostream>
#include<stack>
using namespace std;
int main(){
    char s[1000],stk[1000];
    cin >> s;
    while(s!="0"){
        int top = -1;
        for(int i=0;s[i]!='\0';i++){
           if(top<1||s[i]!='G'){
              top++;
              stk[top]=s[i];                     
           }else if(stk[top-1]=='B'&&stk[top]=='U'){
              top-=2;                                 
           }else{
              top++;
              stk[top]=s[i]; 
           }   
        }
        for(int i=0;i<=top;i++)
           cout << stk[i];
        cout << endl;
        cin >> s;
    }
    return 0;    
}



   同样的,我们可以利用这个数据结构做表达式求值,布尔表达式求值。POJ2106-Boolean Expressions就是这个类型的题目。
0
1
分享到:
评论

相关推荐

    数据结构——堆栈和队列

    总的来说,这个压缩包提供了关于数据结构——堆栈和队列的C语言实现,以及额外的数字转换和字符串处理功能。这些基础知识对于理解和编写高效的计算机程序至关重要。通过学习和理解这些内容,开发者能够更好地解决...

    数据结构与算法——堆栈实现括号匹配

    堆栈(Stack)作为其中一种简单但实用的数据结构,广泛应用于括号匹配问题,例如在编译器、解释器和文本编辑器中。在这个实验中,我们将通过Java实现堆栈来解决括号匹配的问题。 首先,我们需要理解什么是括号匹配...

    数据结构之堆栈和队列教程1.zip

    在本教程中,我们将深入探讨两种基础且重要的数据结构——堆栈(Stack)和队列(Queue)。这些数据结构在算法设计、操作系统、编译原理、数据库管理等众多领域都有广泛的应用。 ### 堆栈(Stack) 堆栈是一种后进...

    数据结构之C++四则运算(自己写的堆栈)

    在这个项目中,C++被用来实现数据结构——堆栈,并利用堆栈处理四则运算。 堆栈是一种后进先出(LIFO)的数据结构,常用于执行回溯、表达式求值和递归等任务。在四则运算中,堆栈可以用于计算中缀表达式(例如,2 +...

    计算机统考数据结构——王道

    常见的数据结构包括数组、链表、树、图、堆栈、队列等。 ### 王道数据结构 “王道数据结构”是一种教学资源,旨在系统、深入地讲解数据结构的概念、原理和应用,帮助学生建立扎实的数据结构基础。该资源通常包含...

    Python数据结构——源程序.rar

    这份"Python数据结构——源程序.rar"压缩包很可能包含了一系列的Python源代码文件,用于教授和演示不同的数据结构,如列表、元组、集合、字典、堆栈和队列等。每个子文件可能代表一个特定的数据结构或操作,例如: ...

    《数据结构》课程实验实训报告__堆栈及队列的基本操作。.docx

    《数据结构》课程实验实训报告主要探讨了两个基础但至关重要的数据结构——堆栈和队列,以及如何在实践中实现它们的基本操作。堆栈和队列是计算机科学中常用的数据组织方式,对于理解和解决各种算法问题具有重要意义...

    数据结构——图

    "堆栈.cpp"和"队列.cpp"可能提供了辅助数据结构堆栈和队列的实现,这两个数据结构在图的遍历和最短路径算法中扮演着关键角色。堆栈用于DFS,队列用于BFS。 学习和理解图的数据结构及其相关算法,对于理解和设计高效...

    数据结构——二叉树

    该文件包括二叉树的头文件(BitTree开头)和堆栈的头文件(Seq开头),另外还实现了编写按层次顺序(同一层自左至右)遍历二叉树的算法、后序递归遍历计算二叉树的深度的算法、判断给定二叉树是否为完全二叉树(通过...

    骑士遍历堆栈国际象棋C++

    【骑士遍历堆栈国际象棋C++】是一种在编程领域中常见的算法问题,它结合了国际象棋的规则和计算机科学中的数据结构——堆栈,来解决在n*n棋盘上实现骑士的不重复遍历。在此问题中,骑士遵循其在国际象棋中的移动规则...

    数据结构算法大全_代码.doc

    以上内容介绍了两种常用的数据结构——堆栈和队列。它们都是计算机科学中最基础的数据结构之一,广泛应用于算法设计和程序开发中。通过模板化的设计,这些数据结构可以适应不同的数据类型,提高了代码的复用性和灵活...

    数据结构论文设计-进制间的转化

    本篇文章将详细介绍如何利用两种常见的数据结构——堆栈(Stack)和队列(Queue)来进行不同进制之间的转换。通过具体的代码实现,我们将展示从十六进制到十进制、从十进制到二进制和八进制的转换过程。 #### 堆栈...

    用堆栈实现汉诺塔演示的窗口应用程序及其C#源代码

    在这个问题中,我们使用了计算机科学中的数据结构——堆栈来解决这个问题。堆栈是一种后进先出(LIFO)的数据结构,非常适合处理此类递归问题。 在C#编程语言中,我们可以创建一个类或结构体来表示盘子,并用一个...

    数据结构与算法 C#

    5. **堆栈与队列**:第5章详细探讨了两种经典的数据结构——堆栈和队列,并着重介绍了它们在解决实际问题中的应用。 6. **BitArray 类**:第6章讲解了`BitArray`类的使用,这是一种用于高效表示大量布尔值的有效...

    数据结构课程堆栈知识应用

    ### 数据结构课程堆栈知识应用 #### 一、概述 在计算机科学中,**数据结构**是一门重要的基础学科,它研究的是数据的组织方式以及这些数据在其上进行的操作。其中,**堆栈**(Stack)作为一种特殊的线性数据结构,在...

    部编版第三章 堆栈与队列.doc

    《部编版第三章 堆栈与队列》这一文档主要探讨了计算机科学中两种基本的数据结构——堆栈(Stack)和队列(Queue),它们都是线性数据结构的特殊形式,对于程序设计和算法实现有着重要的作用。 1. **堆栈(Stack)*...

    数据结构——期末复习.ppt

    数据结构是计算机科学中至关重要的基础概念,它研究如何有效地组织和存储数据,以便于算法的高效执行。在数据结构的期末复习中,通常会涵盖以下几个核心知识点: 1. **算法的时间复杂度**:时间复杂度是衡量算法...

Global site tag (gtag.js) - Google Analytics