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

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

头文件 sharingStack.h

//共享顺序栈
// 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

//共享顺序栈
// 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;elsearr[--top[1]] = data;
}
template <class T>
int sharingStack<T>::pop(int stackIndex)
{if(empty(stackIndex))return 0;if(stackIndex == 0)top[0]--;elsetop[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;elsetop[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

//
// 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时栈满溢出。

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/480477.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

一个励志PM小哥哥的Java转型之路

先给大家看张我朋友圈截图&#xff1a; 这哥们本科学英语的&#xff0c;毕业后做了产品经理&#xff0c;去年 9 月份开始学 Java&#xff0c;6 个月的时间&#xff0c;拿到了快手的 Offer。如果你对 Java 也有兴趣&#xff0c;不妨听完这个故事。你是不是也和他当时的处境…

存储器的分类

存储器的分类 存储器是计算机的重要组成部分之一&#xff0c;用来存储程序和数据&#xff0c;表征了计算机的“记忆”功能 1&#xff0e;按用途分类 ⑴内部存储器 内部存储器又叫内存&#xff0c;是主存储器。用来存储当前正在使用的或经常使用的程序和数据。CPU可以对他直…

最全蚂蚁金服高级Java面试题目(3面)

一面&#xff1a; JVM数据存储模型&#xff0c;新生代、年老代的构造&#xff1f; java GC算法&#xff0c;什么时候会触发minor gc&#xff0c;什么时候会触发full gc&#xff1f; GC 可达性分析中哪些算是GC ROOT&#xff1f; 你熟悉的JVM调优参数&#xff0c;使用过哪些调…

运用事理图谱搞事情:新闻预警、事件监测、文本可视化、出行规划与历时事件流生成

目前&#xff0c;事理图谱在描述领域事件时空信息上具有独特性&#xff0c;这种逻辑图结构能够以一种直观的方式向我们展现出一个领域知识的链路信息。从学术的角度上来说&#xff0c;事理图谱与事件抽取、事件关系抽取、脚本学习、事件链生成、篇章句间关系识别、图谱图结构运…

CCKS 2018 | 最佳论文:南京大学提出 DSKG,将多层 RNN 用于知识图谱补全

本文转载自公众号&#xff1a;机器之心。 选自CCKS 2018作者&#xff1a;Lingbing Guo、Qingheng Zhang、Weiyi Ge、Wei Hu、Yuzhong Qu机器之心编译参与&#xff1a;Panda、刘晓坤2018 年 8 月 14-17 日&#xff0c;主题为「知识计算与语言理解」的 2018 全国知识图谱…

计算机软件系统

计算机软件系统按其功能可分为系统软件和应用软件两大类。1、系统软件系统软件是指管理、控制、和维护计算机及其外部设备&#xff0c;提供用户与计算机之间操作界面等方面的软件&#xff0c;它并不专门针对具体的应用问题。代表性的系统软件有&#xff1a;操作系统、数据库管理…

知识图谱发展的三个时期以及事理图谱概念辨析

一、知识图谱发展三个周期 知识图谱&#xff0c;从2012年谷歌正式将这一概念应用到工业界之后&#xff0c;到现在已经逐步走过了将近7年的时间&#xff0c;在这七年的时间里&#xff0c;知识图谱逐步经历了从概念兴起、概念泛化、技术挣扎与落地尴尬三个环节。 1、 知识图谱的概…

数据结构--栈--浏览器前进后退应用

浏览器前进后退&#xff1a; 当你依次浏览a&#xff0c;b&#xff0c;c,然后回到b&#xff0c;再浏览d&#xff0c;就只能查看a&#xff0c;b&#xff0c;d&#xff0c;了。 原理&#xff1a; 利用两个栈A,B 浏览新网页的时候&#xff0c;压入栈A&#xff0c;清空栈B前进&…

关于BERT,面试官们都怎么问

1.BERT 的基本原理是什么&#xff1f;BERT 来自 Google 的论文Pre-training of Deep Bidirectional Transformers for Language Understanding&#xff0c;BERT 是“Bidirectional Encoder Representations from Transformers”的首字母缩写&#xff0c;整体是一个自编码语言模…

牛逼!支付宝高级Java三面题目:线程锁+事务+雪崩+Docker等

支付宝高级Java一面 JVM中的老年代在什么情况下会触发GC&#xff1f; CMS的垃圾回收步骤&#xff0c;G1和CMS的区别&#xff1f; CMS哪个阶段是并发的&#xff0c;哪个阶段是串行的&#xff1f; 谈谈Java线程池&#xff0c;线程池中几个参数含义 谈谈你了解的J.U.C包的JDK源…

鲍捷 | 深度解析知识图谱发展关键阶段及技术脉络

本文转载自公众号&#xff1a; AI科技大本营 。 分享嘉宾 | 鲍捷&#xff08;文因互联CEO&#xff09;出品 | AI科技大本营&#xff08;公众号ID&#xff1a;rgznai100&#xff09;知识图谱是人工智能三大分支之一——符号主义——在新时期主要的落地技术方式。该技术虽然在 20…

8大常用数据库管理系统简介

转自&#xff1a;http://vps.zzidc.com/vpsjishu/817.html 数据库管理系统(Database Management System)是种操纵和管理数据库的大型软件&#xff0c;是用于建立、使用和维护数据库&#xff0c;简称DBMS。是企业进行数据管理及维护不可或缺的数据管理软件。 8大常用数据库管理系…

知识图谱之语言计算与信息抽取

语言计算与信息抽取是自然语言处理中两块重要内容。本文将根据自己的工作总结&#xff0c;形成了语言计算与信息抽取的知识图谱分布图。 一、总体图谱 二、概念抽取 三、实体抽取 四、事件抽取 五、语言监测 六、文本计算内容 七、文本内容计算应用 总结 本文介绍了关于语言…

数据结构--队列Queue--链式队列、顺序队列

队列&#xff1a;先进先出&#xff0c;就如排队一样&#xff0c;先到的&#xff0c;先排上 1.链式队列 1.1 头文件 listQueue.h /*** description: 链式队列* author: michael ming* date: 2019/4/1 22:47* modified by:*/#ifndef QUEUE_LISTQUEUE_H #define QUEUE_LISTQUEU…

技术动态 | 人工智能开源软件发展现状连载——知识图谱开源软件

本文转载自公众号&#xff1a;中国人工智能开源软件发展联盟&#xff0c;欢迎大家点击文末二维码关注。知识图谱 (Knowledge Graph)是一种基于图的数据结构&#xff0c;由节点(Point)和边(Edge)组成。在知识图谱里&#xff0c;每个节点表示现实世界中存在的“实体”&#xff0c…

2018 支付宝Java开发四面:Ngnix+MQ队列+集群+并发抢购

一面 介绍项目 java 线程池的实现原理&#xff0c;threadpoolexecutor关键参数解释 hashmap的原理&#xff0c;容量为什么是2的幂次 为什么要同时重写hashcode和equals ConcurrentHashMap如何实现线程安全&#xff1f; 介绍Java多线程的5大状态&#xff0c;以及状态图流转…

ACL2020 | 线上搜索结果大幅提升!亚马逊提出对抗式query-doc相关性模型

一只小狐狸带你解锁 炼丹术&NLP 秘籍作者&#xff1a;机智的叉烧&#xff08;OPPO算法工程师&#xff0c;擅长Query理解方向&#xff09;背景搜索和推荐经常会被放在一起对比&#xff0c;其中最突出的区别就是搜索中存在query&#xff0c;需要充分考虑召回内容和query之间的…

微型计算机性能指标以及分类

衡量微型计算机的主要技术指标是&#xff1f;特点是&#xff1f; 2018-11-29 20:38:08 来源&#xff1a;贤集网 赵媛 微型计算机大家应该耳熟能详&#xff0c;它又比称为“微型机”&#xff0c;由于其具备人脑的某些功能&#xff0c;所以也称其为“微电脑”。现在流行的微…

数据结构--队列Queue--循环顺序队列

针对顺序队列中的入队操作&#xff1a;if 队列没满&#xff0c;但是队尾到达数组末尾了&#xff0c;队列"满"了&#xff0c;其实没有满&#xff0c;数据需要整体移至数组头部&#xff0c;才可以继续入队。 为解决该问题&#xff0c;避免数据的挪移&#xff0c;有了循…

基于因果逻辑库的定性事件结果及结果方向性预测

EventPredictBasedOnEG future event predict demo based on causal event graph that covers the full industries that can predict the benefits or bad effects in accordance with the event given by the user, 基于因果逻辑库的定性事件及方向性预测 项目介绍 基于海…