2014-03-18 05:17

题目:设计一个栈,这个栈实际上由一列子栈组成。每当一个子栈的大小达到n,就新产生下一个子栈。整个栈群对外看起来就像普通栈一样,支持取顶top()、压入push()、弹出pop()操作。另外再实现一个弹出特定子栈popAt()的操作。

解法:用stack构成的数组,可以实现快速的随机访问。用stack构成的链表实现,可以防止在中间的一些子栈进行pop操作造成的空隙,但顺序访问的效率要低一些。得根据执行这些操作的偏好和频率来定。

代码:

 // 3.3 Implement a stack with multiple sub-stacks. If one substack exceeds some threshold, allocate a new stack.
#include <cstdio>
#include <stack>
#include <vector>
using namespace std; template <class T>
class StackSet {
public:
StackSet(size_t capacity = ): mcapacity(capacity), msize() {} void push(T val) {
if (mdata.empty() || mdata[mdata.size() - ].size() == mcapacity) {
mdata.push_back(stack<T>());
}
mdata[mdata.size() - ].push(val);
++msize;
} void pop() {
if (mdata.empty()) {
return;
} mdata[mdata.size() - ].pop();
--msize;
while (!mdata.empty() && mdata[mdata.size() - ].empty()) {
mdata.pop_back();
}
} void popAt(size_t idx) {
if (mdata.empty()) {
return;
} if (idx < || idx > mdata.size() - ) {
pop();
return;
} if (mdata[idx].empty()) {
return;
} mdata[idx].pop();
--msize;
} T top() {
return mdata[mdata.size() - ].top();
} size_t size() {
return msize;
}
private:
vector<stack<T> > mdata;
size_t mcapacity;
size_t msize;
}; int main()
{
char str[];
int val; scanf("%d", &val);
StackSet<int> ss(val);
while (scanf("%s", str) == ) {
if (strcmp(str, "end") == ) {
break;
} else if (strcmp(str, "push") == ) {
scanf("%d", &val);
ss.push(val);
} else if (strcmp(str, "pop") == ) {
ss.pop();
} else if (strcmp(str, "top") == ) {
printf("top=%d\n", ss.top());
} else if (strcmp(str, "size") == ) {
printf("size=%u\n", ss.size());
} else if (strcmp(str, "popat") == ) {
scanf("%d", &val);
ss.popAt(val);
}
} return ;
}

《Cracking the Coding Interview》——第3章:栈和队列——题目3的更多相关文章

  1. Cracking the coding interview 第一章问题及解答

    Cracking the coding interview 第一章问题及解答 不管是不是要挪地方,面试题具有很好的联系代码总用,参加新工作的半年里,做的大多是探索性的工作,反而代码写得少了,不高兴,最 ...

  2. 《Cracking the Coding Interview》读书笔记

    <Cracking the Coding Interview>是适合硅谷技术面试的一本面试指南,因为题目分类清晰,风格比较靠谱,所以广受推崇. 以下是我的读书笔记,基本都是每章的课后习题解 ...

  3. Cracking the coding interview

    写在开头 最近忙于论文的开题等工作,还有阿里的实习笔试,被虐的还行,说还行是因为自己的水平或者说是自己准备的还没有达到他们所需要人才的水平,所以就想找一本面试的书<Cracking the co ...

  4. Cracking the coding interview目录及资料收集

    前言 <Cracking the coding interview>是一本被许多人极力推荐的程序员面试书籍, 详情可见:http://www.careercup.com/book. 第六版 ...

  5. Cracking the Coding Interview(Trees and Graphs)

    Cracking the Coding Interview(Trees and Graphs) 树和图的训练平时相对很少,还是要加强训练一些树和图的基础算法.自己对树节点的设计应该不是很合理,多多少少 ...

  6. Cracking the Coding Interview(Stacks and Queues)

    Cracking the Coding Interview(Stacks and Queues) 1.Describe how you could use a single array to impl ...

  7. 数据结构(c语言版,严蔚敏)第3章栈和队列

    第3章栈和队列

  8. 二刷Cracking the Coding Interview(CC150第五版)

    第18章---高度难题 1,-------另类加法.实现加法. 另类加法 参与人数:327时间限制:3秒空间限制:32768K 算法知识视频讲解 题目描述 请编写一个函数,将两个数字相加.不得使用+或 ...

  9. Cracking the Coding Interview 150题(二)

    3.栈与队列 3.1 描述如何只用一个数组来实现三个栈. 3.2 请设计一个栈,除pop与push方法,还支持min方法,可返回栈元素中的最小值.pop.push和min三个方法的时间复杂度必须为O( ...

  10. 数据结构(C语言版)-第3章 栈和队列

    3.1 栈和队列的定义和特点3.2 案例引入3.3 栈的表示和操作的实现3.4 栈与递归3.5 队列的的表示和操作的实现3.6 案例分析与实现 基本操作有入栈.出栈.读栈顶元素值.建栈.判断栈满.栈空 ...

随机推荐

  1. 显示C++数据的数据类型

    #include <typeinfo> using namespace std; ... cout << typeid(d).name() << endl; 其中, ...

  2. April 3 2017 Week 14 Monday

    Don't worry about finding your soul mate. Find yourself. 欲寻佳侣,先觅本心. You may fail to find your soul m ...

  3. java文件

    File类 为了很方便的代表文件的概念,以及存储一些对于文件的基本操作,在java.io包中设计了一个专门的类——File类. 在File类中包含了大部分和文件操作的功能方法,该类的对象可以代表一个具 ...

  4. 前端高质量知识(二)-JS执行上下文(执行环境)详细图解Script

    先随便放张图 我们在JS学习初期或者面试的时候常常会遇到考核变量提升的思考题.比如先来一个简单一点的. console.log(a); // 这里会打印出什么? var a = 20; PS: 变量提 ...

  5. Uva 11572 唯一的雪花

    题目链接:https://uva.onlinejudge.org/external/115/11572.pdf 题意:找到一个尽量长的连续子序列 Al ~ AR ,使得该序列没有相同的元素. 分析:枚 ...

  6. Codeforces 758A Holiday Of Equality

    题目链接:http://codeforces.com/problemset/problem/758/A A. Holiday Of Equality time limit per test 1 sec ...

  7. jQuery 效率提升建议

    jQuery简洁通用的方法集把编码者从繁重的工作中解脱出来,也拉低了进入javascript的门槛,初学者对浏览器兼容性一无所知的情况下,几行代码就可以写出超炫的特效.网上有一篇文章转载比较泛滥,已经 ...

  8. 2018.8.2 Juint测试介绍及其命名的规范

    JUnit - 测试框架 什么是 Junit 测试框架? JUnit 是一个回归测试框架,被开发者用于实施对应用程序的单元测试,加快程序编制速度,同时提高编码的质量.JUnit 测试框架能够轻松完成以 ...

  9. PMVS论文随笔(1)

    博客园排版系统真的比较挫,可以访问我的github.io阅读 关于Unit的概念 在pmvs的源代码中,有一个函数是getUnit ,其函数如下(在PMVS2的windows版本代码,optim.cc ...

  10. 第14章 启动文件详解—零死角玩转STM32-F429系列

    第14章     启动文件详解 全套200集视频教程和1000页PDF教程请到秉火论坛下载:www.firebbs.cn 野火视频教程优酷观看网址:http://i.youku.com/firege ...