博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Cracking the coding interview--Q3.1
阅读量:5958 次
发布时间:2019-06-19

本文共 3820 字,大约阅读时间需要 12 分钟。

题目

原文:

Describe how you could use a single array to implement three stacks.

译文:

你如何只用一个数组实现三个栈?

解答

我们可以很容易地用一个数组来实现一个栈,压栈就往数组里插入值,栈顶指针加1; 出栈就直接将栈顶指针减1;取栈顶值就把栈顶指针指向的单元的值返回; 判断是否为空就直接看栈顶指针是否为-1。

如果要在一个数组里实现3个栈,可以将该数组分为3个部分。如果我们并不知道哪个栈将装 入更多的数据,就直接将这个数组平均分为3个部分,每个部分维护一个栈顶指针, 根据具体是对哪个栈进行操作,用栈顶指针去加上相应的偏移量即可。

代码如下:

class stack3{public:    stack3(int size = 300){        buf = new int[size*3];        ptop[0]=ptop[1]=ptop[2]=-1;        this->size = size;    }    ~stack3(){        delete[] buf;    }    void push(int stackNum, int val){        int idx = stackNum*size + ptop[stackNum] + 1;        buf[idx] = val;        ++ptop[stackNum];    }    void pop(int stackNum){        --ptop[stackNum];    }    int top(int stackNum){        int idx = stackNum*size + ptop[stackNum];        return buf[idx];    }    bool empty(int stackNum){        return ptop[stackNum]==-1;    }private:    int *buf;    int ptop[3];    int size;};

当然,我们也可以有第二种方案。数组不分段,无论是哪个栈入栈,都依次地往这个数组里 存放。这样一来,我们除了维护每个栈的栈顶指针外,我们还需要维护每个栈中, 每个元素指向前一个元素的指针。这样一来,某个栈栈顶元素出栈后,它就能正确地找到下 一个栈顶元素。

所以,数组里存放的不再是基本数据类型的数据,我们需要先定义一个结点结构:

typedef struct node{    int val,preIdx;}node;

数组中的每个元素将是这样一个结点,它保存当前位置的值,和指向上一个结点的索引。

具体代码如下:

class stack3_1{public:    stack3_1(int totalSize = 900){        buf = new node[totalSize];        ptop[0]=ptop[1]=ptop[2]=-1;        this->totalSize = totalSize;        cur = 0;    }    ~stack3_1(){        delete[] buf;    }    void push(int stackNum, int val){        buf[cur].val = val;        buf[cur].preIdx = ptop[stackNum];        ptop[stackNum] = cur;        ++cur;    }    void pop(int stackNum){        ptop[stackNum] = buf[ptop[stackNum]].preIdx;    }    int top(int stackNum){        return buf[ptop[stackNum]].val;    }    bool empty(int stackNum){        return ptop[stackNum]==-1;    }private:    node *buf;    int ptop[3];    int totalSize;    int cur;};

这种实现有一个缺点,在频繁地入栈出栈后,会造成数组空间的大量浪费。 因为当前指针cur是一直递增的,而堆栈在出栈后相应位置的空间将不会再被利用到。 代码中pop函数,只是修改了栈顶指针。如果我们对一个栈先执行出栈,再入栈, 那么再次入栈的位置是在cur,而不是原来栈顶的位置。

有没有避免这种空间浪费的方法呢?当然是有的。不过这样一来,对cur的操作就变得复杂 了。第一,每次执行pop操作,检查该元素对应索引是否小于cur,如果是, 将cur更新到该元素索引;否则cur不变。第二,每次执行完push操作, cur要沿着数组依次向后查找,直到找到第一个空的空间,用它的索引更新cur。 这部分代码实现起来也是没什么难度的,这里不再贴出。

以下是完整代码:

#include 
using namespace std;class stack3{public: stack3(int size = 300){ buf = new int[size*3]; ptop[0]=ptop[1]=ptop[2]=-1; this->size = size; } ~stack3(){ delete[] buf; } void push(int stackNum, int val){ int idx = stackNum*size + ptop[stackNum] + 1; buf[idx] = val; ++ptop[stackNum]; } void pop(int stackNum){ --ptop[stackNum]; } int top(int stackNum){ int idx = stackNum*size + ptop[stackNum]; return buf[idx]; } bool empty(int stackNum){ return ptop[stackNum]==-1; }private: int *buf; int ptop[3]; int size;};typedef struct node{ int val,preIdx;}node;class stack3_1{public: stack3_1(int totalSize = 900){ buf = new node[totalSize]; ptop[0]=ptop[1]=ptop[2]=-1; this->totalSize = totalSize; cur = 0; } ~stack3_1(){ delete[] buf; } void push(int stackNum, int val){ buf[cur].val = val; buf[cur].preIdx = ptop[stackNum]; ptop[stackNum] = cur; ++cur; } void pop(int stackNum){ ptop[stackNum] = buf[ptop[stackNum]].preIdx; } int top(int stackNum){ return buf[ptop[stackNum]].val; } bool empty(int stackNum){ return ptop[stackNum]==-1; }private: node *buf; int ptop[3]; int totalSize; int cur;};int main(){ stack3_1 mystack;//stack3 mystack; for(int i=0; i<10; ++i) mystack.push(0, i); for(int i=10; i<20; ++i) mystack.push(1, i); for(int i=100; i<110; ++i) mystack.push(2, i); for(int i=0; i<3; ++i) cout<
<<" "; cout<

 

转载地址:http://srkax.baihongyu.com/

你可能感兴趣的文章
将网络中的图片存为NSData并保存到sqlite的BLOB字段中
查看>>
Cocos2d-js-v3.2 在 mac 上配置环境以及编译到 Andorid 的注意事项(转)
查看>>
iOS用三种途径实现一方法有多个返回值
查看>>
python--class test
查看>>
从零开始理解JAVA事件处理机制(3)
查看>>
HttpURLConnection类的使用
查看>>
linux命令分析---SED (二)
查看>>
[INS-32025] 所选安装与指定 Oracle 主目录中已安装的软件冲突。
查看>>
py2与py3差别
查看>>
windows知识点
查看>>
第五章多态课后java_Java程序设计课后练习答案
查看>>
idea无用插件_没用过这些IDEA插件?怪不得写代码头疼
查看>>
linuxliveu盘怎么用_怎么用U盘重装系统?
查看>>
国际学院c语言作业,C语言程序的国际化
查看>>
四阶龙格库塔法c语言程序,四阶龙格库塔法C语言(西安交大)
查看>>
c语言中无windows函数库,关于C语言, GCC/MSVC中,如何写出一个真正意义上的不依赖库的程序?...
查看>>
欧洲语言框架A1到C2,法语等级 A1、A2、B1、B2、C1、C2
查看>>
c语言中以追加只写方式打开文本文件,C语言中打开文件读取,写入的操作
查看>>
c语言编程 企业发放,求c语言编程企业员工全年销售额统计及奖金发放系..._统计师_帮考网...
查看>>
C语言编辑中午和英语库,懂英语和C语言的来
查看>>