顺序栈(C++)
栈的定义为只允许在表的末端进行插入和删除的线性表。简而言之就是先进后出的线性表。
插入和删除的一端被称呼为栈顶(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++)的更多相关文章
- 数据结构:C_顺序栈的实现
数据结构顺序栈的实现(C语言版) 1.写在前面 栈是一种遵循元素先进(Push)后出(Pop)规则的线性表,它的实现可以用数组或者链表. ..... 2.代码分解 2.1对栈的结构定义: typede ...
- D_S 顺序栈的基本操作
// main.cpp #include <iostream> using namespace std; #include "Status.h" typedef in ...
- 数据结构Java实现05----栈:顺序栈和链式堆栈
一.堆栈的基本概念: 堆栈(也简称作栈)是一种特殊的线性表,堆栈的数据元素以及数据元素间的逻辑关系和线性表完全相同,其差别是线性表允许在任意位置进行插入和删除操作,而堆栈只允许在固定一端进行插入和删除 ...
- 01顺序栈_Stack---(栈与队列)
#include "stdio.h" #include "stdlib.h" #include "io.h" #include " ...
- 把十进制整数转换为r(r=2)进制输出(顺序栈实现)
上周的第二个作业补上~~ 上周的要求: 1.给出顺序栈的存储结构定义. 2.完成顺序栈的基本操作函数. 1) 初始化顺序栈 2) 实现入栈和出栈操作 3) 实现取栈顶元素 ...
- 数据结构之顺序栈SqStack
顺序栈SqStack 基本操作 Status InitStack()//构造一个空栈S Status DestroyStack()//销毁栈S,S不再存在 Status ClearStack()//把 ...
- 顺序栈之C++实现
顺序栈就是用顺序表(数组)实现的栈.其组织形式如下图所示: 下面介绍下我用C++实现的顺序栈,在VC6下调试通过.不足之处还请指正. 1.文件组织 2.ss.h栈类的声明及宏的定义 #ifndef _ ...
- 顺序栈和链式栈(C++实现)
顺序栈,是一种基于数组的存储表示. 实现类代码如下: template<class T> class SeqStack{ T *element; int top; int maxSize; ...
- salesforce零基础学习(七十六)顺序栈的实现以及应用
数据结构中,针对线性表包含两种结构,一种是顺序线性表,一种是链表.顺序线性表适用于查询,时间复杂度为O(1),增删的时间复杂度为O(n).链表适用于增删,时间复杂度为O(1),查询的时间复杂度为O(n ...
- 【小白成长撸】--顺序栈(C语言版)
// 顺序栈.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h"//test1.0--栈表仅限Int类型 #include <stdio. ...
随机推荐
- Android Jetpack Compose 引入示例工程
引入 Jetpack Compose 示例工程 去GitHub上找到Compose的示例工程 https://github.com/android/compose-samples ,clone到本地 ...
- linux&c 进程控制 课后习题
(声明:本篇博客只是博主自己的理解,加以整理,目的是总结刚学过的进程知识,不一定绝对正确,非常愿意听客官您提出宝贵意见.) Q1:进程中的全局数据段(全局变量),局部数据段(局部变量),静态数据段的分 ...
- TestNG 参数化应用
一.第一种参数化方式(testng.xml配置参数) 1.新建ParameterDemo04类 2.拷贝类的路径 3.testng.xml配置类地址及参数 <?xml version=" ...
- url的hash和HTML5的history
url的hash和HTML5的history 第一种方法是改变url的hash值. **显示当前路径 : **location.href http://localhost:8080/# 切换路径: l ...
- idea Mark Directory as 的几种文件类型
1. Source roots (or source folders) 源文件夹 通过为该类别分配文件夹,可以告诉IntelliJ IDEA该文件夹及其子文件夹包含应在构建过程中进行编译的源代码. 2 ...
- 大爽Python入门教程 1-5 答案
大爽Python入门公开课教案 点击查看教程总目录 1 方向变换 >>> 51//4 12 >>> 51%4 3 答: 向左转51次之后, 小明面朝东方, 转过了1 ...
- [bzoj1934]善意的投票
最小割,考虑最小割就是要将整张图分为两块,本题中就分别表示赞同和不赞同,那么首先一开始赞同的点向S连边,不赞同的点向T连边,如果这些点分到了另一边就要割掉这条边,朋友关系同理,连双向边同样表示分到两边 ...
- springboot项目中常遇到的问题-初学者最容易犯的错
1.在spring中有两个main方法 2.在idea中少提代码类了,或者某类中代码依赖关系没解决掉
- javascript-初级-day04js数据类型
day01-js数据类型 <!DOCTYPE HTML> <html> <head> <meta http-equiv="Content-Type& ...
- MySQL 在线开启&关闭GTID模式
MySQL 在线开启&关闭GTID模式 目录 MySQL 在线开启&关闭GTID模式 基本概述 在线开启GTID 1. 设置GTID校验ENFORCE_GTID_CONSISTENCY ...