栈的定义为只允许在表的末端进行插入和删除的线性表。简而言之就是先进后出的线性表。

插入和删除的一端被称呼为栈顶(top),而不允许插入删除的一端被称为栈底(bottom)。无元素时的栈即为空栈。

使用一维数组实现栈

//stack.h
#ifndef STACK_H
#define STACK_H
#include<iostream>
#include<assert.h>
using namespace std;
const int maxSize = 50; template<class T>
class Stack
{
public:
Stack(){};
virtual void Push(const T& x) = 0;
virtual void Pop(T& x) = 0;
virtual bool getTop(T& x) = 0;
virtual bool IsEmpty()const = 0;
virtual bool IsFull()const = 0;
virtual int getSize()const = 0;
};
#endif
//main.cpp

#include"stack.h"
const int stackIncreament = 20; template<class T>
class SeqStack : public Stack<T>
{
private:
T *elements; //栈数组
int top; //栈顶指针
int maxSize;//栈的大小
void overflowProcess();//自动扩容函数
public:
SeqStack(int sz = 50);
~SeqStack(){delete[]this->elements;}
void Push(const T& x);//向栈中压入元素
void Pop(T& x);//出栈
bool getTop(T& x);//获取栈顶元素
bool IsEmpty()const{return (this->top==-1 ? true : false);}
bool IsFull()const{return (this->top+1==this->maxSize ? true : false);}
int getSize()const{return this->top+1;}
void MakeEmpty(){this->top = -1;}//使栈空
void print();
friend ostream& operator<<(ostream& out, SeqStack<T>& s)//声明为友元函数,重载输出运算符<<
{
out<<"top = "<<s.top<<endl;
for(int i=0; i<=s.top; ++i)
out<<i<<":"<<s.elements[i]<<endl;
return out;
}
};
template<class T>
void SeqStack<T>::print()
{
if(!this->IsEmpty())
{
for(int i=this->top; i>=0; --i)
cout<<" ["<<this->elements[i]<<"] ";
cout<<endl;
}
}
template<class T>
void SeqStack<T>::Push(const T& x)
{
if(!this->IsFull())
{
++this->top;
this->elements[this->top] = x;
}
else
{
this->overflowProcess();
this->elements[this->top] = x;
++this->top;
}
};
template<class T>
void SeqStack<T>::Pop(T& x)
{
if(!this->IsEmpty())
{
x = this->elements[this->top];
--this->top;
}
};
template<class T>
bool SeqStack<T>::getTop(T& x)
{
if(!this->IsEmpty())
{
x = this->elements[this->top-1];
return true;
}
return false;
};
template<class T>
void SeqStack<T>::overflowProcess()
{
T *newArry = new T[maxSize+stackIncreament];
if(newArry == NULL)
{
cout<<"内存分配失败!"<<endl;
exit(1);
}
for(int i=0; i<this->maxSize; ++i)
newArry[i] = this->elements[i];
this->maxSize = this->maxSize+stackIncreament;
delete[]this->elements;
this->elements = newArry;
};
template<class T>
SeqStack<T>::SeqStack(int sz):top(-1),maxSize(sz)
{
this->elements = new T[this->maxSize];
assert(this->elements != NULL);
}; int main()
{
SeqStack<int> ss;
for(int i=0; i<60; ++i)
ss.Push(i);
int i = int();
ss.Pop(i);
cout<<i<<endl;
ss.print();
cout<<ss<<endl;
return 0;
}

试试执行效果

因为换行过多没有将整幅图上传。

顺序栈(C++)的更多相关文章

  1. 数据结构:C_顺序栈的实现

    数据结构顺序栈的实现(C语言版) 1.写在前面 栈是一种遵循元素先进(Push)后出(Pop)规则的线性表,它的实现可以用数组或者链表. ..... 2.代码分解 2.1对栈的结构定义: typede ...

  2. D_S 顺序栈的基本操作

    //  main.cpp #include <iostream> using namespace std; #include "Status.h" typedef in ...

  3. 数据结构Java实现05----栈:顺序栈和链式堆栈

    一.堆栈的基本概念: 堆栈(也简称作栈)是一种特殊的线性表,堆栈的数据元素以及数据元素间的逻辑关系和线性表完全相同,其差别是线性表允许在任意位置进行插入和删除操作,而堆栈只允许在固定一端进行插入和删除 ...

  4. 01顺序栈_Stack---(栈与队列)

    #include "stdio.h" #include "stdlib.h" #include "io.h" #include " ...

  5. 把十进制整数转换为r(r=2)进制输出(顺序栈实现)

    上周的第二个作业补上~~ 上周的要求: 1.给出顺序栈的存储结构定义. 2.完成顺序栈的基本操作函数. 1)      初始化顺序栈 2)      实现入栈和出栈操作 3)      实现取栈顶元素 ...

  6. 数据结构之顺序栈SqStack

    顺序栈SqStack 基本操作 Status InitStack()//构造一个空栈S Status DestroyStack()//销毁栈S,S不再存在 Status ClearStack()//把 ...

  7. 顺序栈之C++实现

    顺序栈就是用顺序表(数组)实现的栈.其组织形式如下图所示: 下面介绍下我用C++实现的顺序栈,在VC6下调试通过.不足之处还请指正. 1.文件组织 2.ss.h栈类的声明及宏的定义 #ifndef _ ...

  8. 顺序栈和链式栈(C++实现)

    顺序栈,是一种基于数组的存储表示. 实现类代码如下: template<class T> class SeqStack{ T *element; int top; int maxSize; ...

  9. salesforce零基础学习(七十六)顺序栈的实现以及应用

    数据结构中,针对线性表包含两种结构,一种是顺序线性表,一种是链表.顺序线性表适用于查询,时间复杂度为O(1),增删的时间复杂度为O(n).链表适用于增删,时间复杂度为O(1),查询的时间复杂度为O(n ...

  10. 【小白成长撸】--顺序栈(C语言版)

    // 顺序栈.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h"//test1.0--栈表仅限Int类型 #include <stdio. ...

随机推荐

  1. 力扣 - 剑指 Offer 58 - I. 翻转单词顺序

    题目 剑指 Offer 58 - I. 翻转单词顺序 思路1 假如题目要求我们翻转字符串,那么我们可以从末尾往前开始遍历每一个字符,同时将每一个字符添加到临时空间,最后输出临时空间的数据就完成翻转了, ...

  2. Pod 健康检查和服务可用性检查

    Kubernetes 对 Pod 的健康状态可以通过两类探针来检查:LivenessProbe 和 ReadinessProbe,kubelet 定期执行这两类探针来针对容器的健康状况. Livene ...

  3. Spring Cloud Alibaba 使用 feign 和 rebion 进行服务消费

    微服务的服务消费,一般是使用 feign 和 rebion 调用服务提供,进行服务的消费,本文将实战使用代码讲解服务的消费. 微服务环境的搭建 创建一个 springboot 项目,springboo ...

  4. 重装系统——联想window 10

    大四了,读了四年大学,唉,混的,啥也不会,工作也找不到,真的不知道这大学四年到底干了什么.专业是计算机方向的,但居然,不敢,也不会装电脑系统,大学四年的文件都是乱放的,更那个的是,有些软件卸载不完全, ...

  5. 攻防世界 Misc 新手练习区 give_you_flag Writeup

    攻防世界 Misc 新手练习区 give_you_flag Writeup 题目介绍 题目考点 gif图片分离 细心的P图 二维码解码 Writeup 下载附件打开,发现是一张gif图片,打开看了一下 ...

  6. 手把手从0到1:搭建Kubernetes集群

    搭建 k8s 集群网上很多教程,如果是手工部署或者实验环境可以直接使用 MiniKube 或者 Kind,来在本地启动简单的 Kubernetes 集群进行后面的学习即可.如果是使用 MiniKube ...

  7. 【Java】数组Array

    Java基础复习之:数组 简介 数组(Array):多个相同数据类型按照一定顺序排列的集合,并使用一个名字命名,通过编号的方式对这些数据进行统一管理 一维数组 一维数组的声明与初始化 int[] id ...

  8. js 实现边缘撞击检测动画

    js 实现边缘撞击检测动画 <!DOCTYPE html> <html lang="en"> <head> <meta charset=& ...

  9. Java经典面试题(二)-不古出品

    @ 目录 1. 为什么说 Java 语言"编译与解释并存"? 2.Oracle JDK 和 OpenJDK 的对比? 3.字符型常量和字符串常量的区别? 4.Java 泛型了解么? ...

  10. js 开始

    hello world 开始JavaScript 是一种脚本语言,它的解释器被称为 JavaScript 引擎.JavaScript 被发明用于在 HTML 网页上使用,给HTML网页增加动态功能.J ...