首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >数据结构--栈--共享顺序栈

数据结构--栈--共享顺序栈

作者头像
Michael阿明
发布2021-02-20 10:25:59
发布2021-02-20 10:25:59
54700
代码可运行
举报
运行总次数:0
代码可运行

共享顺序栈:内部也是一个数组 将两个栈放在数组的两端,一个从数组首端开始压栈,一个从数组尾部开始压栈,等到两边栈顶在中间相遇时,栈满。 共享顺序栈在某些情况下可以节省空间。

头文件 sharingStack.h

代码语言:javascript
代码运行次数:0
运行
复制
//共享顺序栈
// Created by mingm on 2019/3/28.
//
#ifndef STACK_SHARINGSTACK_H
#define STACK_SHARINGSTACK_H

#include <iostream>
template <class T> class sharingStack
{
private:
    int top[2], bot[2]; //双栈的栈顶指针和栈底指针
    T* arr;     //栈数组
    int capacity;   //栈容量
public:
    sharingStack(int size = 10);    //初始化,总容量默认10
    ~sharingStack()
    {
        delete [] arr;
        arr = NULL;
    }
    void push(const T& data, int stackIndex);    //将数据压入index号栈内
    int pop(int stackIndex);        //将index号栈顶元素弹出
    T* getTop(int stackIndex);      //返回index号栈顶元素
    bool empty(int stackIndex) const    //判断是否为空
    {
        return top[stackIndex] == bot[stackIndex];
    }
    bool full() const   //判断栈是否满
    {
        return top[0]+1 == top[1];
    }
    void clear(int stackIndex);     //清空index号栈
    void printOneSide(int stackIndex) const;    //打印一侧栈
    void printAll() const;                      //打印所有
};

#endif //STACK_SHARINGSTACK_H

共享顺序栈 类实现 sharingStack.cpp

代码语言:javascript
代码运行次数:0
运行
复制
//共享顺序栈
// Created by mingm on 2019/3/28.
//
#include "sharingStack.h"
//#include <assert.h>
#include <iostream>
template <class T>
sharingStack<T>::sharingStack(int size):capacity(size)
{
    top[0] = -1;
    bot[0] = -1;
    top[1] = size;
    bot[1] = size;
    arr = new T [size];
}
template <class T>
void sharingStack<T>::push(const T &data, int stackIndex)
{
//    assert(!full());    //如果栈满了(条件为false),程序终止
    if(full())
        throw("stack is full !");
    if(stackIndex == 0)
        arr[++top[0]] = data;
    else
        arr[--top[1]] = data;
}
template <class T>
int sharingStack<T>::pop(int stackIndex)
{
    if(empty(stackIndex))
        return 0;
    if(stackIndex == 0)
        top[0]--;
    else
        top[1]++;
    return 1;
}
template <class T>
T* sharingStack<T>::getTop(int stackIndex)
{
    if(empty(stackIndex))
        return NULL;
    return &arr[top[stackIndex]];
}
template <class T>
void sharingStack<T>::clear(int stackIndex)
{
    if(stackIndex == 0)
        top[0] = bot[0] = -1;
    else
        top[1] = bot[1] = capacity;
}
template <class T>
void sharingStack<T>::printOneSide(int stackIndex) const
{
    if(empty(stackIndex))
    {
        std::cout << "----Stack " << stackIndex << " is empty---- " << std::endl;
        return;
    }
    else
    {
        if(stackIndex == 0)
        {
            std::cout << "----Stack " << stackIndex << " bottom---- " << top[stackIndex]+1 << " elem(s)" << std::endl;
            for(int i = bot[0]+1; i<= top[0]; ++i)
            {
                std::cout << arr[i] << std::endl;
            }
            std::cout << "----Stack " << stackIndex << " top---- " << top[stackIndex]+1 << " elem(s)" << std::endl;
        }
        else
        {
            std::cout << "----Stack " << stackIndex << " top---- " << bot[stackIndex]-top[stackIndex] << " elem(s)" << std::endl;
            for(int i = top[1]; i< bot[1]; ++i)
            {
                std::cout << arr[i] << std::endl;
            }
            std::cout << "----Stack " << stackIndex << " bottom---- " << bot[stackIndex]-top[stackIndex] << " elem(s)" << std::endl;
        }
    }
}
template <class T>
void sharingStack<T>::printAll() const
{
    std::cout << "****capacity of doubleStack is " << capacity << " *****" << std::endl;
    printOneSide(0);
    printOneSide(1);
    std::cout << "*******************************************" << std::endl;
}

测试主程序 sharingStack_testMain.cpp

代码语言:javascript
代码运行次数:0
运行
复制
//
// Created by mingm on 2019/3/28.
//
#include "sharingStack.cpp"
#include <iostream>
using namespace std;
int main()
{
    int L[3] = {0,3,4};
    int len1 = 5, len2;
    for(int k = 0; k < 3; ++k)
    {
        len2 = L[k];
        sharingStack<int> doubleIntStack(8);
        for(int i = 0; i < len1; ++i)
        {
            try
            {
                doubleIntStack.push(i,0);
            }
            catch(const char* ch)
            {
                cout << ch << endl;
                break;
            }
        }
        for(int i = 0; i < len2; ++i)
        {
            try
            {
                doubleIntStack.push(i,1);
            }
            catch(const char* ch)
            {
                cout << ch << endl;
                break;
            }
        }
        doubleIntStack.printAll();
    }
    return 0;
}

valgrind检查结果

上面给定栈容量8,#0栈长度5,让#1栈长度分别为0,3,4,当为4时栈满溢出。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2019/03/29 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 头文件 sharingStack.h
  • 共享顺序栈 类实现 sharingStack.cpp
  • 测试主程序 sharingStack_testMain.cpp
  • valgrind检查结果
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档