栈和队列常见问题及其算法和c++实现

1.实现一个栈,要求实现push,pop,Min(返回最小值的操作)的时间复杂度为O(1)

算法思想:需要设计一个辅助栈,用来存储当前栈中元素的最小值。额外需要注意push操作,第一个元素不用比较,自动成为最小值入栈,其他元素每次都要和栈顶元素进行比较,小的入栈。

#include<iostream>

#include<stack>      //直接用系统中的栈,不需要自己实现

using namespace std;

template<class T>

class Stack

{

public:

void push(const T& x)

{

_stack.push(x);

if (_minstack.empty())

{

_minstack.push(x);

}

else

{

if (x < _minstack.top())

{

_minstack.push(x);

}

else

{

_minstack.push(_minstack.top());

}

}

}

void pop()

{

_stack.pop();

_minstack.pop();

}

T Retmin()

{

return _minstack.top();

}

private:

stack<T> _stack;

stack<T> _minstack;

};

void test()

{

Stack<int> s;

int ret;

s.push(3);

s.push(2);

s.push(5);

s.push(1);

s.push(7);

s.pop();

s.pop();

ret = s.Retmin();

cout << "最小值是:" << ret << endl;

}

int main()

{

test();

return 0;

}

2.元素出栈入栈顺序的合法性检查

算法思想:用for循环将数组1中的元素入栈,每入栈一个与数组2中当前元素进行进行比较,如果相同就出栈,数组2中下一个元素作为当前元素。如果循环结束,而栈中还有元素,就说明数组2不是pop序列。

#include<iostream>

#include<stack>

using namespace std;

bool InvalidCheck(int* stack_in, int* stack_out, int len1, int len2)

{

stack<int> s;

if (len1 != len2)

{

return false;

}

int i = 0, j = 0;

for (i = 0, j = 0; i < len1; i++)

{

s.push(stack_in[i]);

while (s.size()>0 && s.top() == stack_out[j])

{

s.pop();

j++;

}

}

if (s.size() > 0)

return false;

else

return true;

}

int main()

{

int stack_in[] = { 1, 2, 3, 4, 5 };

int stack_out[] = { 4, 5, 1, 2, 3 };

int len1 = sizeof(stack_in) / sizeof(stack_in[0]);

int len2 = sizeof(stack_out) / sizeof(stack_out[0]);

bool ret = InvalidCheck(stack_in, stack_out, len1, len2);

if (ret)

{

cout << "出栈顺序合法!" << endl;

}

else

{

cout << "出栈顺序不合法!" << endl;

}

return 0;

}

时间: 2024-10-14 05:57:02

栈和队列常见问题及其算法和c++实现的相关文章

FIFO调度算法和LRU算法

一.理论 FIFO:先进先出调度算法 LRU:最近最久未使用调度算法 两者都是缓存调度算法,经常用作内存的页面置换算法. 打一个比方,帮助你理解.你有很多的书,比如说10000本.由于你的书实在太多了,你只能放在地下室里面.你看书的时候不会在地下室看书,而是在书房看书.每次,你想看书都必须跑到地下室去找出来你想看的书,然后抱回来放到书桌上,之后才开始看.还有就是,有一些书你会反复的看,今天看了也许过几天又要看.总之,你自己是不知道你哪天会需要看哪本书的.你的老师每天下课的时候会给你布置一个书单,

Learning Data Structure_2_线性表、栈和队列

一个人在学校的日子有些寂寞,但是st说男人要耐得住寂寞,做学问也是如此吧.今天看了线性表.栈和队列的内容.以下是学习记录. 线性表(list) 1.定义:0个或多个数据元素的有限序列,元素有且只有一个直接后继和一个直接前驱:基本操作ListLength.GetElem.LocateElem.ListInsert等,并集Union的实现. 2.线性表的顺序存储结构 指用一段地址连续的存储单元依次存储数据元素(c语言中用数组实现改结构):数组长度>=线性表的长度:对于任意位置的存入或取出的所需时间相

【数据结构】栈和队列

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

《数据结构》C++代码 栈与队列

线性表中,先进先出的叫队列,先进后出的叫栈.队列常用于BFS,而在函数递归层数过高时,需要手动实现递归过程,这时候便需要写一个“手动栈”. 有时候,我们会有大量数据频繁出入队列,但同时存在其内的元素却不多,此时需要写“循环队列”.其代码并不难,但里面下标递增的语句值得斟酌一下. k=(k+1)%maxn; 这句话用到了取模运算%,是非常浪费时间的.若能避免使用%,则可以大大提高代码运行速度.我做了一个测试,把下面五种语句写法分别运行5×10^8次,在我的机器上用codeblocks10.05各运

C++ 栈和队列的介绍与使用

使用标准库的栈和队列时,先包含相关的头文件 #include<stack> #include<queue> 定义栈如下: stack<int> stk; 定义队列如下: queue<int> q; 栈提供了如下的操作 s.empty() 如果栈为空返回true,否则返回false s.size() 返回栈中元素的个数 s.pop() 删除栈顶元素但不返回其值 s.top() 返回栈顶的元素,但不删除该元素 s.push() 在栈顶压入新元素 队列提供了下面的

表、栈和队列(1)

目录 1.抽象数据类型 2.表ADT 2.1.表的简单数组实现 2.2.简单链表 3.Java Collections API中的表 3.1.Collection接口 3.2.Iterator接口 3.3.List接口.ArrayList类和LinkedList类 3.4.例子:remove方法对LinkedList类的应用 3.5.关于ListInterator 本系列讨论最简单的和最基本的三种数据类型:表.栈和队列,实际上,每一个有意义的程序都将显式的用到一种或多种这样的数据结构,而栈在程序

数据结构(二)栈、队列和数组

栈 栈的定义 栈是限制在表的一端进行插入和删除的线性表.允许插入.删除的这一端称为栈顶,另 一个固定端称为栈底.当表中没有元素时称为空栈. 栈的存储实现和运算实现 栈是运算受限的线性表,线性表的存储结构对栈也是适用的,只是操作不同而已. 利用顺序存储方式实现的栈称为顺序栈. 与线性表类似,栈的动态分配顺序存储结构如 下: #define STACK_INIT_SIZE 100 //存储空间的初始分配量 #define STACKINCREMENT 10 //存储空间的分配增量 typedef s

快速记忆数组栈和队列函数push()和shift()

在js中,对数组的操作是比较常见的,有时候,我们需要模拟栈和队列的特性才能实现需求,今天来给大家用通俗易懂.简洁明了的几行文字,来告诉大家栈和队列的几个函数,如何快速记住. 首先,概念还是要知道的: 栈(stack)又名堆栈,它是一种运算受限的线性表.其限制是仅允许在表的一端进行插入和删除运算.这一端被称为栈顶,相对地,把另一端称为栈底.向一个栈插入新元素又称作进栈.入栈或压栈,它是把新元素放到栈顶元素的上面,使之成为新的栈顶元素:从一个栈删除元素又称作出栈或退栈,它是把栈顶元素删除掉,使其相邻

3-3-行编辑程序-栈和队列-第3章-《数据结构》课本源码-严蔚敏吴伟民版

课本源码部分 第3章  栈和队列 - 行编辑程序 ——<数据结构>-严蔚敏.吴伟民版        源码使用说明  链接??? <数据结构-C语言版>(严蔚敏,吴伟民版)课本源码+习题集解析使用说明        课本源码合辑  链接??? <数据结构>课本源码合辑        习题集全解析  链接??? <数据结构题集>习题解析合辑        本源码引入的文件  链接? SequenceStack.c        相关测试数据下载  链接? 无数据