careercup-栈与队列 3.3
3.3 栈就像叠盘子,当盘子叠得太高时,就会倾斜倒下。因此,在真实的世界中,当一叠盘子 (栈)超过了一定的高度时,我们就会另起一堆,再从头叠起。实现数据结构SetOfStacks 来模拟这种情况。SetOfStacks由几个栈组成,当前一栈超出容量时,需要创建一个新的栈 来存放数据。SetOfStacks.push()和SetOfStacks.pop()的行为应当和只有一个栈时 表现的一样。
进一步地,
实现函数popAt(int index)在指定的子栈上进行pop操作。
实现第一步:
#include<iostream>
#include<new>
using namespace std; //myStack表示一个栈
class myStack
{
private:
int *buf;
int capacity;
int cur;
public:
myStack(int size=)
{
buf=new int[size];
capacity=size;
cur=-;
}
~myStack()
{
delete[] buf;
}
void push(int x)
{
buf[++cur]=x;
}
void pop()
{
cur--;
}
int top()
{
return buf[cur];
}
bool empty()
{
return cur==-;
}
bool full()
{
return cur==capacity-;
}
}; //一个栈组成的数组
class SetOfStacks
{
private:
myStack *st;
int cur;
int capacity;
public:
SetOfStacks(int cap=)
{
st=new myStack[cap];
capacity=cap;
cur=;
}
~SetOfStacks()
{
delete[] st;
}
void push(int x)
{
if(st[cur].full())
cur++;
if(cur>capacity-)
return;
st[cur].push(x);
}
void pop()
{
if(st[cur].empty())
cur--;
if(cur<)
return;
st[cur].pop();
}
int top()
{
if(st[cur].empty())
cur--;
if(cur<)
return ;
else
return st[cur].top();
}
bool empty()
{
return cur==&&st[cur].empty();
}
bool full()
{
return cur==capacity-&&st[cur].full();
}
};
int main()
{
SetOfStacks ss1;
for(int i=; i<*+; ++i)
{
ss1.push(i);
}
while(!ss1.empty())
{
cout<<ss1.top()<<endl;
ss1.pop();
}
return ;
}
当加入popAt函数,情况就变得复杂了。因为这时候的数据分布可能出现中间的某些子栈使 用popAt把它们清空了,而后面的子栈却有数据。为了实现方便,我们不考虑因为popAt 带来的空间浪费。即如果我用popAt把中间某些子栈清空了,并不把后面子栈的数据往前移 动。这样一来,cur指向操作的“最后”一个栈,它后面的子栈一定都是空的, 而它本身及前面的子栈由于popAt函数的缘故都有可能是空的。如果没有popAt函数, cur前面的子栈一定都是满的(见上面的例子)。这样一来,push仍然只需要判断一次当前子 栈是否为满。但是,pop函数则要从cur向前一直寻找,直到找到一个非空的子栈, 才能进行pop操作。同理,popAt,top,empty也是一样的。
#include<iostream>
#include<new>
using namespace std; //myStack表示一个栈
class myStack
{
private:
int *buf;
int capacity;
int cur;
public:
myStack(int size=)
{
buf=new int[size];
capacity=size;
cur=-;
}
~myStack()
{
delete[] buf;
}
void push(int x)
{
buf[++cur]=x;
}
void pop()
{
cur--;
}
int top()
{
return buf[cur];
}
bool empty()
{
return cur==-;
}
bool full()
{
return cur==capacity-;
}
}; //一个栈组成的数组
class SetOfStacks
{
private:
myStack *st;
int cur;
int capacity;
public:
SetOfStacks(int cap=)
{
st=new myStack[cap];
capacity=cap;
cur=;
}
~SetOfStacks()
{
delete[] st;
}
void push(int x)
{
if(st[cur].full())
cur++;
if(cur>capacity-)
return;
st[cur].push(x);
}
void pop()
{
while(st[cur].empty())
cur--;
if(cur<)
return;
st[cur].pop();
}
int top()
{
while(st[cur].empty())
cur--;
if(cur<)
return ;
else
return st[cur].top();
}
bool empty()
{
while(cur>=&&st[cur].empty())
cur--;
return cur==-;
}
bool full()
{
return cur==capacity-&&st[cur].full();
}
void popAt(int idx)
{
while(st[idx].empty()) --idx;
st[idx].pop();
}
};
int main()
{
SetOfStacks ss1;
for(int i=; i<*+; ++i)
{
ss1.push(i);
}
for(int i=; i<; ++i)
{
ss1.popAt();
//ss1.popAt(1);
ss1.popAt();
}
while(!ss1.empty())
{
cout<<ss1.top()<<endl;
ss1.pop();
}
return ;
}
careercup-栈与队列 3.3的更多相关文章
- 学习javascript数据结构(一)——栈和队列
前言 只要你不计较得失,人生还有什么不能想法子克服的. 原文地址:学习javascript数据结构(一)--栈和队列 博主博客地址:Damonare的个人博客 几乎所有的编程语言都原生支持数组类型,因 ...
- [ACM训练] 算法初级 之 数据结构 之 栈stack+队列queue (基础+进阶+POJ 1338+2442+1442)
再次面对像栈和队列这样的相当基础的数据结构的学习,应该从多个方面,多维度去学习. 首先,这两个数据结构都是比较常用的,在标准库中都有对应的结构能够直接使用,所以第一个阶段应该是先学习直接来使用,下一个 ...
- 剑指Offer面试题:6.用两个栈实现队列
一.题目:用两个栈实现队列 题目:用两个栈实现一个队列.队列的声明如下,请实现它的两个函数appendTail和deleteHead,分别完成在队列尾部插入结点和在队列头部删除结点的功能. 原文是使用 ...
- C实现栈和队列
这两天再学习了数据结构的栈和队列,思想很简单,可能是学习PHP那会没有直接使用栈和队列,写的太少,所以用具体代码实现的时候出现了各种错误,感觉还是C语言功底不行.栈和队列不论在面试中还是笔试中都很重要 ...
- JavaScript数组模拟栈和队列
*栈和队列:js中没有真正的栈和队列的类型 一切都是用数组对象模拟的 栈:只能从一端进出的数组,另一端封闭 FILO 何时使用:今后只要仅希望数组只能从一端进 ...
- 用JS描述的数据结构及算法表示——栈和队列(基础版)
前言:找了上课时数据结构的教程来看,但是用的语言是c++,所以具体实现在网上搜大神的博客来看,我看到的大神们的博客都写得特别好,不止讲了最基本的思想和算法实现,更多的是侧重于实例运用,一边看一边在心里 ...
- JavaScript中的算法之美——栈、队列、表
序 最近花了比较多的时间来学习前端的知识,在这个期间也看到了很多的优秀的文章,其中Aaron可能在这个算法方面算是我的启蒙,在此衷心感谢Aaron的付出和奉献,同时自己也会坚定的走前人这种无私奉献的分 ...
- Java数据结构和算法之栈与队列
二.栈与队列 1.栈的定义 栈(Stack)是限制仅在表的一端进行插入和删除运算的线性表. (1)通常称插入.删除的这一端为栈顶(Top),另一端称为栈底(Bottom). (2)当表中没有元素时称为 ...
- python数据结构之栈、队列的实现
这个在官网中list支持,有实现. 补充一下栈,队列的特性: 1.栈(stacks)是一种只能通过访问其一端来实现数据存储与检索的线性数据结构,具有后进先出(last in first out,LIF ...
- 栈和队列的面试题Java实现【重要】
栈和队列: 面试的时候,栈和队列经常会成对出现来考察.本文包含栈和队列的如下考试内容: (1)栈的创建 (2)队列的创建 (3)两个栈实现一个队列 (4)两个队列实现一个栈 (5)设计含最小函数min ...
随机推荐
- 通用php与mysql数据库配置文件
<?php header("content-type:text/html;charset = utf-8"); $dblink = mysql_connect("l ...
- COGS 577 蝗灾 [CDQ分治入门题]
题目链接 昨天mhr神犇,讲分治时的CDQ分治的入门题. 题意: 你又一个w*w正方形的田地. 初始时没有蝗虫. 给你两个操作: 1. 1 x y z: (x,y)这个位置多了z只蝗虫. 2. 2 x ...
- Web-Scale IT:对企业的影响
本文翻译自文章Web-Scale IT: The Enterprise Impact. 作者Brendan Ziolo 在通信.网络和安全行业有着近20年的经验,在 Sipera Systems,Ce ...
- Sectong日志分析
http://tech.uc.cn/?p=2866#comments http://blog.sectong.com/blog/hw_bigdata.html
- Mozilla研究—深入理解mozilla所需的背景知识
mozilla是一个以浏览器为中心的软件平台,它在我们平台中占有重要地位.我们用它来实现WEB浏览器.WAP浏览器.邮件系统.电子书和帮助阅读器等应用程序.为此,我最近花了不少时间去阅读mozilla ...
- MySQL优化器cost计算
记录MySQL 5.5上,优化器进行cost计算的方法. 第一篇: 单表的cost计算 数据结构: 1. table_share: 包含了表的元数据,其中索引部分: key_info:一个key的结构 ...
- WinPcap编程入门实践
转自:http://www.cnblogs.com/blacksword/archive/2012/03/19/2406098.html WinPcap可能对大多数人都很陌生,我在这里就先简单介绍一下 ...
- 图片上传,支持同步/异步、预览(MVC、uploadify异步提交、js预览、ajaxSubmit异步提交)兼容大部分浏览器,含代码
图片上传代码,支持同步/异步和图片的预览 主要用了两种方式,可兼容大部分浏览器. 第一种使用uploadify异步上传,上传后返回图片路径显示到页面. 每二种使用ajaxSubmit异步上传,为兼容I ...
- 如何解决PHP生成UTF-8编码的CSV文件用Excel打开乱码的问题
为了识别 Unicode 文件,Microsoft 建议所有的 Unicode 文件应该以 ZERO WIDTH NOBREAK SPACE字符开头.这作为一个”特征符”或”字节顺序标记(byte-o ...
- Android学习笔记(十)BroadcastReceiver初体验
BroadcastReceiver是Android系统的四大组件之一,本质是一种全局的监听器,用于接收系统全局的广播消息.真因为如此,BroadcastReceiver可以很方便的是实现系统中不同组件 ...