C++ 栈和队列的简单封装(9.3)

2024-09-04 07:12
文章标签 简单 c++ 封装 队列 9.3

本文主要是介绍C++ 栈和队列的简单封装(9.3),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

1.栈的封装

代码

#include <iostream>using namespace std;typedef int datatype;
class Stack
{
private:datatype *data;int max_size;       //栈的大小int the_top;        //栈顶
public:Stack(){data= new int[50];max_size = 50;the_top = -1;}Stack(int a){data= new int[a];max_size = a;the_top = -1;}~Stack(){delete[] data;}//访问栈顶元素datatype &top(){return *(data+the_top);}//判空bool empty(){return the_top==-1;}//求栈的大小int size(){return the_top+1;}//插入元素void push(datatype e){if(the_top==max_size-1){cout<<"栈满,入栈失败"<<endl;}else{data[++the_top]=e;}}//删除元素void pop(){if(the_top==-1){cout<<"删除失败"<<endl;}else{the_top--;}}//赋值运算符Stack &operator=(const Stack& other){//自赋值检查if(this==&other){return *this;}//释放旧数据delete [] data;data = nullptr;the_top = -1;//分配新数据max_size = other.max_size;data = new datatype[max_size];//复制数据the_top = other.the_top;for (int i = 0; i <= the_top; ++i){data[i] = other.data[i];}// 返回当前对象的引用return *this;}void show()const{if(the_top==-1){cout << "栈为空" << endl;return;}else{cout << "栈内容(从栈底到栈顶): ";for (int i = the_top; i >= 0; --i){cout << data[i] << " ";}cout << endl;}}};int main()
{//插入演示Stack s1(10);s1.push(1);s1.push(2);s1.push(3);s1.show();cout<<"******************"<<endl;//访问栈顶元素演示cout<<s1.top()<<endl;cout<<"******************"<<endl;//求栈的大小演示cout<<s1.size()<<endl;cout<<"******************"<<endl;//删除演示s1.pop();s1.show()
;    cout<<"******************"<<endl;//赋值=演示Stack s2(5);s2=s1;s2.show();cout<<"******************"<<endl;return 0;
}

 运行结果:

 

 

2.队列的封装

 代码:

#include <iostream>using namespace std;typedef int datatype; // 队列中存储的数据类型class Queue
{
private:datatype* data;int front;          // 队首元素的索引int rear;           // 队尾元素的下一个位置的索引int max_size;       // 队列的最大容量int c_size;         // 队列当前的大小
public://有参构造Queue(int n):front(0),rear(0),max_size(n),c_size(0){data = new datatype[max_size];}//析构函数~Queue(){delete [] data;}//访问第一个元素 my_frontdatatype my_front(){if(empty()){cout<<"队列为空"<<endl;return 0;}else{return data[front];}}//访问最后一个元素 backdatatype back(){if(empty()){cout<<"队列为空"<<endl;return 0;}else{return data[(rear - 1 + max_size) % max_size]; // 循环队列处理}}//判空 emptybool empty(){return c_size==0;}//返回容纳的元素数 sizeint size()const{return c_size;}//队尾插入元素 pushvoid push(datatype e){if(c_size == max_size)  //判满{cout<<"队列已满"<<endl;}else{data[rear] = e;rear = (rear + 1) % max_size; // 循环队列处理++c_size;}}//删除首个元素 popvoid pop(){if(empty()){cout<<"队列为空"<<endl;}else{front = (front + 1) % max_size; // 循环队列处理--c_size;}}//赋值 operator=Queue& operator=(const Queue& other){if (this != &other){delete[] data; // 删除旧数据max_size = other.max_size;data = new datatype[max_size];// 复制数据c_size = other.c_size;front = other.front;rear = other.rear;for (int i = 0; i < c_size; ++i){data[(front + i) % max_size] = other.data[(other.front + i) % other.max_size];}}return *this;}//展示函数void show()const{if(c_size==0){cout<<"队列为空"<<endl;return;}else{cout << "队列内容: ";for (int i = 0; i < c_size; i++){cout<<data[(front +i)% max_size]<<" ";}cout << endl;}}
};int main()
{Queue q1(5);//插入演示q1.push(1);q1.push(2);q1.push(3);q1.show();cout<<"******************"<<endl;//访问第一个元素cout<<q1.my_front()<<endl;cout<<"******************"<<endl;//访问最后一个元素cout<<q1.back()<<endl;cout<<"******************"<<endl;//返回size大小演示cout<<q1.size()<<endl;cout<<"******************"<<endl;//删除演示q1.pop();q1.show();cout<<"******************"<<endl;//赋值=演示Queue q2(6);q2=q1;q2.show();cout<<"******************"<<endl;return 0;
}

运行结果:

 

 

 

3.继承  思维导图

这篇关于C++ 栈和队列的简单封装(9.3)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1135351

相关文章

hdu1180(广搜+优先队列)

此题要求最少到达目标点T的最短时间,所以我选择了广度优先搜索,并且要用到优先队列。 另外此题注意点较多,比如说可以在某个点停留,我wa了好多两次,就是因为忽略了这一点,然后参考了大神的思想,然后经过反复修改才AC的 这是我的代码 #include<iostream>#include<algorithm>#include<string>#include<stack>#include<

【C++ Primer Plus习题】13.4

大家好,这里是国中之林! ❥前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站。有兴趣的可以点点进去看看← 问题: 解答: main.cpp #include <iostream>#include "port.h"int main() {Port p1;Port p2("Abc", "Bcc", 30);std::cout <<

csu 1446 Problem J Modified LCS (扩展欧几里得算法的简单应用)

这是一道扩展欧几里得算法的简单应用题,这题是在湖南多校训练赛中队友ac的一道题,在比赛之后请教了队友,然后自己把它a掉 这也是自己独自做扩展欧几里得算法的题目 题意:把题意转变下就变成了:求d1*x - d2*y = f2 - f1的解,很明显用exgcd来解 下面介绍一下exgcd的一些知识点:求ax + by = c的解 一、首先求ax + by = gcd(a,b)的解 这个

hdu2289(简单二分)

虽说是简单二分,但是我还是wa死了  题意:已知圆台的体积,求高度 首先要知道圆台体积怎么求:设上下底的半径分别为r1,r2,高为h,V = PI*(r1*r1+r1*r2+r2*r2)*h/3 然后以h进行二分 代码如下: #include<iostream>#include<algorithm>#include<cstring>#include<stack>#includ

C++包装器

包装器 在 C++ 中,“包装器”通常指的是一种设计模式或编程技巧,用于封装其他代码或对象,使其更易于使用、管理或扩展。包装器的概念在编程中非常普遍,可以用于函数、类、库等多个方面。下面是几个常见的 “包装器” 类型: 1. 函数包装器 函数包装器用于封装一个或多个函数,使其接口更统一或更便于调用。例如,std::function 是一个通用的函数包装器,它可以存储任意可调用对象(函数、函数

C++11第三弹:lambda表达式 | 新的类功能 | 模板的可变参数

🌈个人主页: 南桥几晴秋 🌈C++专栏: 南桥谈C++ 🌈C语言专栏: C语言学习系列 🌈Linux学习专栏: 南桥谈Linux 🌈数据结构学习专栏: 数据结构杂谈 🌈数据库学习专栏: 南桥谈MySQL 🌈Qt学习专栏: 南桥谈Qt 🌈菜鸡代码练习: 练习随想记录 🌈git学习: 南桥谈Git 🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈�

【C++】_list常用方法解析及模拟实现

相信自己的力量,只要对自己始终保持信心,尽自己最大努力去完成任何事,就算事情最终结果是失败了,努力了也不留遗憾。💓💓💓 目录   ✨说在前面 🍋知识点一:什么是list? •🌰1.list的定义 •🌰2.list的基本特性 •🌰3.常用接口介绍 🍋知识点二:list常用接口 •🌰1.默认成员函数 🔥构造函数(⭐) 🔥析构函数 •🌰2.list对象

06 C++Lambda表达式

lambda表达式的定义 没有显式模版形参的lambda表达式 [捕获] 前属性 (形参列表) 说明符 异常 后属性 尾随类型 约束 {函数体} 有显式模版形参的lambda表达式 [捕获] <模版形参> 模版约束 前属性 (形参列表) 说明符 异常 后属性 尾随类型 约束 {函数体} 含义 捕获:包含零个或者多个捕获符的逗号分隔列表 模板形参:用于泛型lambda提供个模板形参的名

usaco 1.3 Prime Cryptarithm(简单哈希表暴搜剪枝)

思路: 1. 用一个 hash[ ] 数组存放输入的数字,令 hash[ tmp ]=1 。 2. 一个自定义函数 check( ) ,检查各位是否为输入的数字。 3. 暴搜。第一行数从 100到999,第二行数从 10到99。 4. 剪枝。 代码: /*ID: who jayLANG: C++TASK: crypt1*/#include<stdio.h>bool h

uva 10387 Billiard(简单几何)

题意是一个球从矩形的中点出发,告诉你小球与矩形两条边的碰撞次数与小球回到原点的时间,求小球出发时的角度和小球的速度。 简单的几何问题,小球每与竖边碰撞一次,向右扩展一个相同的矩形;每与横边碰撞一次,向上扩展一个相同的矩形。 可以发现,扩展矩形的路径和在当前矩形中的每一段路径相同,当小球回到出发点时,一条直线的路径刚好经过最后一个扩展矩形的中心点。 最后扩展的路径和横边竖边恰好组成一个直