1 栈-OOP

2023-11-12

栈实现的是后进先出(先进后出)策略,队列实现的是先进先出策略。

1 栈

栈上的操作主要包括

  1. INSERT操作称为压入(PUSH)。注意上溢问题,即往满栈里添加元素。
  2. 无参数版本的DELETE操作称为弹出(POP)。注意下溢问题,即从空栈上取元素。
  3. STACK-EMPTY判断栈是否为空

栈的实现思路

用一个数组s[1..n]来实现一个最多可容纳n个元素的栈。该数组有一个参数s.top用来指示要插入元素的位置,s[0]是栈底,s[s.top-1]是栈顶。

伪代码

1.判断栈是否为空:

empty()
if stack.top == 0
    return true
else 
    return false

2.插入push

if top > size
    error"upflow"
else
    stack[top] =x;
    top=top+1 

3.删除pop

if empty()
    error "underflow"
else
    pop = pop-1
    return stack[pop]   

栈的模板实现

#include <iostream>

template<class T, const int size = 100>
class Stack{
    T s[size];
    int top;
public:
    Stack():top(0){}
    bool empty(){ return top == 0;}
    T pop(){
        if(top <= 0){
            std::cerr << "下溢";
            exit(0);
        }
        return s[--top];
    }
    void push(T t){
        if(top >= size){
            std::cerr << "上溢";
            exit(0);
        }
        s[top++] = t;
    }
};
//测试代码
int main(){
    const int size = 10;
    Stack<int, size> si;
    for (int i = 0; i < size; i++){
        std::cout << i;
        si.push(i);
    }
    std::cout << std::endl;
    while(!si.empty())
        std::cout << si.pop();
}
在一个数组中实现两个栈,使当两个栈元素个数之和不为n时,都不会上溢。PUSH和POP操作的运行时间都为O(1)

要2个栈公用一个存储空间,栈顶指针从两端指针开始,当两端指针指向同一个内存时则发生上溢。

#include <iostream>

template<class T, const int size = 100>
class Stack{
    T s[size];
    int top1;
    int top2;
public:
    Stack():top1(0),top2(size-1){}
    bool empty(int index){ 
        if(index == 1)
            return top1 == 0;
        else
            return top2 == size-1;
    }
    T pop(int index){
        if(index ==1 && top1 == 0){
            std::cerr << "下溢";
            exit(0);
        }
        if(index == 2 && top2 == size-1){
            std::cerr << "下溢";
            exit(0);
        }
        if(index ==1 )
            return s[--top1];
        else
            return s[++top2];
    }
    void push(T t, int index){
        if(top1 == top2){
            std::cerr << "上溢";
            exit(0);
        }
        if(index == 1)
            s[top1++] = t;
        else
            s[top2--] = t;
    }
};

int main(){
    const int size = 10;
    Stack<int, size> si;
    for (int i = 0; i < 4; i++){
        std::cout << i;
        si.push(i,1);
    }
    std::cout << std::endl;
    for (int i = 0; i < 5; i++){
        std::cout << i;
        si.push(i,2);
    }
    std::cout << std::endl;
    while(!si.empty(1))
        std::cout << si.pop(1);
    std::cout << std::endl;
    while(!si.empty(2))
        std::cout << si.pop(2);
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

1 栈-OOP 的相关文章

  • 作为属性的类引用

    谷歌对于这类搜索毫无用处 因为你会得到数亿个结果 其中没有一个与特定问题相关 问题很简单 Delphi 中是否可以有类引用属性 如果是这样 怎么办 这是我尝试过的 type TMyObject class end TMyObjectClas
  • 我应该如何使用 Perl URI 类?

    我需要在 Perl 程序中处理一些 HTTP URL 但我怀疑应该如何处理URI https metacpan org module URI类帮助我 特别是 我想使用URI用于解析相对 URL 并获取其组件的类 然而 问题是 我需要一个可以
  • 在运行时选择模板参数时如何避免代码呈指数级增长

    考虑一堆基本类型 Foo 所有这些都具有通用方法的独特实现 Bar 我可以结合Foo1 Foo2 Foo5像这样 CombinedFoo
  • Python Tkinter OOP 布局配置

    我正在尝试使用 tkinter 构建一个应用程序 该布局在没有 OO 原则的情况下工作 但我很难理解应该如何将其转移到 OO The layout is as shown in the pic below 1280x720px 我有以下内容
  • Mootools 使用“extend”方法扩展“Function”类,导致 jQuery 无法使用

    Mootools 扩展了 Function 类 并在其中添加了一个名为 extend 的新方法 现在 jQuery 尝试使用 jQuery prototype extend 添加 扩展 功能 然而 由于 extend 已经是 jQuery
  • JavaScript - 这个这个

    String prototype foo String prototype foo bar function How can you reference the grandparent string console log this par
  • PHP 特性 - 定义通用常量

    定义可由命名空间内的多个类使用的常量的最佳方法是什么 我试图避免过多的继承 因此扩展基类不是理想的解决方案 并且我正在努力寻找使用特征的良好解决方案 这在 PHP 5 4 中是否可行 或者应该采取不同的方法 我有以下情况 trait Bas
  • 如何获取MATLAB句柄对象的ID?

    当我尝试使用时出现问题MATLAB 句柄对象 http www mathworks com help techdoc ref handle html作为关键值MATLAB 容器 Map http www mathworks com help
  • 我可以在 Laravel 5.2 中创建一个继承自 User 的新类吗?

    我对 Laravel 还很陌生 使用的是迄今为止的最新版本 5 2 因此我遇到了以下困境 我知道 Laravel 附带了一个User开箱即用的类 但我想开发一个系统 在其中我可以有另外两种类型的用户 称为Researcher and Adm
  • 覆盖Java中的属性[重复]

    这个问题在这里已经有答案了 在 Java 中 我最近有几个项目 我使用了这样的设计模式 public abstract class A public abstract int getProperty public class B exten
  • 如何在 Angular 2 应用程序中从 TypeScript/JavaScript 中的字符串获取类?

    在我的应用程序中 我有这样的内容 user ts export class User 现在 我这样做 应用程序组件 ts callAnotherFunction User 如果我将类名作为字符串 即 我该如何做到这一点 User 如果可能的
  • 如何为抽象工厂创建的类设置特定属性?

    是否可以让具体工厂使用抽象工厂模式为其创建具有特定类型参数的具体类 或者由各自的具体工厂创建的不同具体类是否需要具有相同的字段 例如 在下图中 您将如何使用客户端 应用程序 给出的不同参数集来实例化 WinButton 和 OSXButto
  • Javascript:我应该隐藏我的实现吗?

    作为一名 C 程序员 我有一个习惯 将可以而且应该私有的东西设为私有 当 JS 类型向我公开其所有私有部分时 我总是有一种奇怪的感觉 而且这种感觉并没有被 唤起 假设我有一个类型draw方法 内部调用drawBackground and d
  • R 中使用 `UseMethod()` 与 `inherits()` 来确定对象的类

    如果我需要根据 R 对象的类以不同的方式处理它们 我可以使用if and else在单个函数内 foo lt function x if inherits x list Foo the list else if inherits x num
  • Facebook api 回调的上下文?

    有没有办法在 javascript facebook sdk api 回调中传递上下文 这是一个简单的例子 现在这不起作用 因为我的回调函数中的变量 this name 将是未定义的 因为它不在我的用户对象上下文中 知道怎么做吗 funct
  • 在javascript中访问函数内的实例变量?

    如何以最简单的方式访问函数内的实例变量 function MyObject Instance variables this handler Methods this enableHandler function var button doc
  • 接口中的构造方法

    接口中的构造方法不好吗 为什么人们认为有人想要实例化接口 我们想要做的是强制实现者实现构造函数 就像其他接口方法一样 接口就像一个合同 假设我有一个接口 Queue 并且我想确保实现者创建一个带有一个参数的构造函数 该构造函数创建一个单例队
  • Java中接口作为方法参数

    前几天去面试 被问到了这样的问题 问 反转链表 给出以下代码 public class ReverseList interface NodeList int getItem NodeList nextNode void reverse No
  • 从同一个类中的另一个构造函数调用构造函数

    我有一个带有两个构造函数的类 C 这是代码片段 public class FooBar public FooBar string s constructor 1 some functionality public FooBar int i
  • 在方法内部执行方法

    我目前正在 FreeCodeCamp 中进行 JavaScript 练习 我的代码应该使用的测试用例之一是函数调用 如下所示 addTogether 2 3 这是我得到的基本功能 function addTogether return 当我

随机推荐

  • python下列合法的变量名是什么_下面哪个是 Python 合法的变量名 _____ 。_学小易找答案...

    单选题 下列 方法可以将字符串的所有字符转换成为大写字母 多选题 在 官当 方面 唐律对犯公罪者和私罪者处理不同 主要规定有 单选题 设 s Happy New Year 则 s 3 8 的值为 单选题 The date of the me
  • 微信小程序wx.login()获取openid,附:前端+后端代码(超详细版)

    微信小程序开放了微信登录的api 无论是个人还是企业申请的小程序均可使用 首先创建一个项目 把这些代码都清空 我们自己写 然后 开始写了 首先index wxml 写一个button用于发起登录 index wxml
  • 完全监督时序动作定位Fully Supervised Temporal Action Localization 论文阅读

    proposal classification 目前fully supervised动作定位算法可以分为两类 top down和bottom up top down方法通过滑动不同尺度的窗口获取proposals 它的缺陷在于 生成的pro
  • gethibernatetemplate的find方法大全

    一 find String queryString 示例 this getHibernateTemplate find from bean User 返回所有User对象 二 find String queryString Object v
  • [C++][模板]char*作为模板实参时的一个问题

    当char 作为模板时 不同长度的字符串可能会被编译器认为是不同的两种模板类型实参 即 char s1 abcd char s2 efghijkl templace
  • 人脸检测与识别:AlexNet人脸检测

    最终目标 为课题组做一个人脸打卡系统 项目1阶段已更新完毕 如有错误请不吝赐教 注 作为一个负责任的博主 虽然过了好几个月了 但必须要说明一下 文中代码有bug cv2 resize时 参数输入是 宽 高 通道 遂在inference做高斯
  • 4 步搞定 Hive 增量更新

    Hive 的更新很有趣 Hive 的表有两种 一种是 managed table 一种是 external table managed table 是 Hive 自动帮我们维护的表 自动分割底层存储文件 自动分区 这些自动化的操作 都是 H
  • 基于MINGW编译阿里云aliyun-oss-cpp-sdk

    Windows下基于MINGW编译aliyun oss cpp sdk 安装CMake工具 安装MINGW工具 下载aliyun oss cpp sdk 编译 注意 以下编译的都是64位版本的库 如果需要编译32位 需要将MINGW切换版本
  • openGL API之glFramebufferTexture2D函数详解

    前言 将2维纹理对象绑定到帧缓冲区 帧缓冲区本身是不存放颜色 深度等信息的 这些信息需要通过纹理 深度缓存来存放 这些缓存可以绑定到帧缓冲区上 这种绑定关系会被opengl记录 不会随着当前帧缓冲区改变而改变 因而这个帧缓冲区和纹理单元有点
  • android非正常关掉应用操作--最近任务列表,应用管理

    手机实测现象 华为荣耀3C Android4 2 魅族MX5 Android5 1 1 长按home键 左右滑动卡片 task的root activity的onDestroy会走 2 长按home键 按清除按钮 task的root Acti
  • springboot项目集成mp使用id自增报错

    mp中的配置 这样设置以后 id会按照雪花算法在全局id中不重复新增 如果你没在实体类中设置id的自增策略会默认使用这种方式 mybatis plus mapper locations classpath mapper xml type a
  • 流程图与活动图的区别与联系

    文章目录 题目要求 一 流程图 1 Definition 2 Symbols 3 Examples 二 活动图定义 1 Definition 2 Basic components of an activity diagram 3 Symbo
  • tar常用命令介绍

    最常见的压缩与解压命令是tar 参数讲解 c表示产生新的包 r表示增加文件的意思 u表示更新文件 t列出包中的文件 x解开包的意思 这五个是独立的命令 压缩解压都要用到其中一个 可以和别的命令连用但只能用其中一个 举例 tar cf all
  • Fedora 31配置和桌面美化笔记

    Fedora是一个非常流行的Linux发行版 与Ubuntu齐名 但是Fedora相对于Ubuntu更加激进 新软件和新内核会直接上到Fedora的软件源中 所以如果你那种比较喜欢更新软件的人 但是又感觉Arch Manjaro这类滚动发行
  • VMware中安装FusionCompute8.1.1 CNA和VRM镜像安装

    VMware中安装FcusionCompute8 1 一 VMware Workstation分别安装CNA VRM 注意事项 根据自身电脑的规格 一般8G 内存的电脑配置可以支持 若自己电脑是4G规格建议跳过该实验 若自己电脑是8G规格建
  • 调试最长的一帧(第三天)

    先看看整体 以及进度 第三天的内容 主要讲根据窗口参数建立图形上下文设备 建立一个全屏显示的图形设备 这个WindowingSystemInterface是纯虚基类 也就是下一步就要父类调用子类了 获取或新建显示设置 各成员变量 成员变量的
  • 机器学习基础(二)

    线性回归 误差是独立并且具有相同的分布通常认为服从均值为0方差为的高斯分布 损失函数 loss Function 代价函数 Cost Function 其实两种叫法都可以 损失函数 loss function 或代价函数 cost func
  • rust放置木箱转向_腐蚀Rust新手入门教学图文攻略 从入门到精通技巧详解_游侠网...

    腐蚀Rust怎么玩 正式版将于2月8日正式发售 体验版已经发售多年了 想必不少喜欢的玩家都有体验过 今天给大家带来了 chnodon 分享的腐蚀Rust新手入门教学图文攻略 一起来看下吧 新手入门教学图文攻略 如下图为游戏开始界面 左侧选择
  • openstack 安装并验证 Nova( 计算节点 + 控制节点)

    安装数据库 登录数据库创建 nova nova api nova cell0 数据库 root controller etcd mysql uroot pmaster Welcome to the MariaDB monitor Comma
  • 1 栈-OOP

    栈实现的是后进先出 先进后出 策略 队列实现的是先进先出策略 1 栈 栈上的操作主要包括 INSERT操作称为压入 PUSH 注意上溢问题 即往满栈里添加元素 无参数版本的DELETE操作称为弹出 POP 注意下溢问题 即从空栈上取元素 S