Essential C++第五章习题

news2024/11/26 18:38:45

目录

5.1

5.2

5.3

5.4


5.1

C++代码:

//Stack.h

#include<vector>
#include<string>
#include<iostream>
using namespace std;

#pragma once

#ifndef _STACK_H_
#define _STACK_H_

typedef string elemType;

class Stack
{
public:
	//基类的析构函数设置为虚函数
	virtual ~Stack(){};
	//纯虚函数
	virtual bool pop(elemType& elem)=0;
	virtual bool push(const elemType& elem) = 0;
	virtual bool peek(int index, elemType& elem) = 0;
	virtual int top()const = 0;
	virtual int size()const = 0;
	virtual bool empty()const = 0;
	virtual bool full()const = 0;
	virtual void print(ostream& os = cout)const = 0;
	friend ostream& operator<<(ostream& os , Stack& rhs);
};

class LIFO_Stack :public Stack
{
private:
	vector<elemType> _stack;
	int _top; //用于标识当前栈顶的位置
public:
	LIFO_Stack(vector<elemType>vec, int top = 0);
	virtual bool pop(elemType& elem);
	virtual bool push(const elemType& elem);
	virtual bool peek(int index, elemType& elem);
	virtual int top()const;
	virtual int size()const;
	virtual bool empty()const;
	virtual bool full()const;
	virtual void print(ostream& os = cout)const;
};

//Peekback_Stack可以在不更改stack元素的前提下,访问任何一个元素 -- 对成员函数peek进行修改即可,其他成员函数与LIFO_Stack中的基本相同
class Peekback_Stack:public Stack
{
private:
	vector<elemType> _stack;
	int _top; //用于标识当前栈顶的位置
public:
	Peekback_Stack(vector<elemType>vec, int top = 0);
	virtual bool pop(elemType& elem);
	virtual bool push(const elemType& elem);
	virtual bool peek(int index, elemType& elem);
	virtual int top()const;
	virtual int size()const;
	virtual bool empty()const;
	virtual bool full()const;
	virtual void print(ostream& os = cout)const;
};
#endif


//Stack.cpp

#include"Stack.h"

//Stack
ostream& operator<<(ostream& os, Stack& rhs)
{
	rhs.print();
	return os;
}

//LIFO_Stack
LIFO_Stack::LIFO_Stack(vector<elemType>vec, int top)
{
	_top = top;
	_stack = vec;
}

bool LIFO_Stack::pop(elemType& elem)
{
	if (empty())
	{
		cout << "栈为空" << endl;
		return false;
	}
	else
	{
		//_top所指的为栈的最高且未插入元素的地方,所以 --_top所指示的地方才是此时栈的最后一个元素
		elem = _stack[--_top];
		_stack.pop_back();
		return true;
	}
}

bool LIFO_Stack::push(const elemType& elem)
{
	if (full())
	{
		cout << "栈已满" << endl;
		return false;
	}
	else
	{
		_stack.push_back(elem);
		_top++;
		return true;
	}
}

bool LIFO_Stack::peek(int index, elemType& elem)
{
	return false;
}

int LIFO_Stack::top()const
{
	return _top;
}

int LIFO_Stack::size()const
{
	return _stack.size();
}

bool LIFO_Stack::empty()const
{
	if (_top ==0)
	{
		return true;
	}
	return false;
}

bool LIFO_Stack::full()const
{
	if (_stack.size() == _stack.max_size())
	{
		return true;
	}
	return false;
}

void LIFO_Stack::print(ostream& os)const
{
	os << "栈中的元素:" << endl;
	for (int i = 0; i < _stack.size(); i++)
	{
		os << _stack[i]<<" ";
	}
	os << endl;
	os << "栈的大小:" << size() << endl;
	os << "栈指针此时的位置:" << top() << endl;
}

//Peekback_Stack
Peekback_Stack::Peekback_Stack(vector<elemType>vec, int top)
{
	_top = top;
	_stack = vec;
}

bool Peekback_Stack::pop(elemType& elem)
{
	if (empty())
	{
		cout << "栈为空" << endl;
		return false;
	}
	else
	{
		//_top所指的为栈的最高且未插入元素的地方,所以 --_top所指示的地方才是此时栈的最后一个元素
		elem = _stack[--_top];
		_stack.pop_back();
		return true;
	}
}

bool Peekback_Stack::push(const elemType& elem)
{
	if (full())
	{
		cout << "栈已满" << endl;
		return false;
	}
	else
	{
		_stack.push_back(elem);
		_top++;
		return true;
	}
}

bool Peekback_Stack::peek(int index, elemType& elem)
{
	if (index > _top)
	{
		return false;
	}
	else
	{
		elem = _stack[index];
		return true;
	}
}

int Peekback_Stack::top()const
{
	return _top;
}

int Peekback_Stack::size()const
{
	return _stack.size();
}

bool Peekback_Stack::empty()const
{
	if (_top == 0)
	{
		return true;
	}
	return false;
}

bool Peekback_Stack::full()const
{
	if (_stack.size() == _stack.max_size())
	{
		return true;
	}
	return false;
}

void Peekback_Stack::print(ostream& os)const
{
    os << "栈中的元素:" << endl;
	for (int i = 0; i < _stack.size(); i++)
	{
		os << _stack[i]<<" ";
	}
	os << endl;
	os << "栈的大小:" << size() << endl;
	os << "栈指针此时的位置:" << top() << endl;
}

//main.cpp

#include"Stack.h"

int main()
{
	string arr[3] =
	{
		"GodFishhh",
		"AFish",
		"Fish"
	};
	vector<string>vec(arr, arr + 3);
	LIFO_Stack Lifo(vec,vec.size());
	Peekback_Stack Peek(vec,vec.size());

	//测试LIFO_Stack类的data member
	cout << "Lifo:" << endl;
	cout << Lifo << endl;
	cout << "经过push后:" << endl;
	Lifo.push("RubFish");
	cout << Lifo << endl;
	cout << "经过pop后:" << endl;
	string temp;
	Lifo.pop(temp);
	cout << Lifo << endl;
	cout << "pop出的元素为:" << temp << endl;

	cout << "---------------------" << endl;

	//测试Peekback_Stack类的data member
	cout << "Peek:" << endl;
	cout << Peek << endl;
	cout << "经过push后:" << endl;
	Peek.push("DogFish");
	cout << Peek << endl;
	cout << "经过pop后:" << endl;
	Peek.pop(temp);
	cout << Peek << endl;
	cout << "pop出的元素为:" << temp << endl;

	cout << "使用Peekback_Stack类额外的peek()函数" << endl;
	string temp1;
	Peek.peek(0, temp1);
	cout << "peek出的元素为:" << temp1 << endl;
	system("pause");
	return 0;
}

程序运行结果:

5.2

C++代码:

//Stack.h

#include<vector>
#include<iostream>
#include<string>
using namespace std;

typedef string elemType;

#ifndef _STACK_H_
#define _STACK_H_

#pragma once

class Stack
{
public:
	//基类的析构函数设置为虚函数
	virtual ~Stack() {};
	//纯虚函数
	Stack(vector<elemType>vec, int top = 0);
	bool pop(elemType& elem);
	bool push(const elemType& elem);
	int top()const;
	int size()const;
	bool empty()const;
	bool full()const;
	void print(ostream& os = cout)const;
	friend ostream& operator<<(ostream& os, Stack& rhs);

	//唯一在派生类中实现功能不同的函数
	virtual bool peek(int index, elemType& elem) = 0;
protected:
	vector<elemType>_stack;
	int _top;
};

class LIFO_Stack :public Stack
{
public:
	LIFO_Stack(vector<elemType>vec, int top = 0) :Stack(vec, top) {};
	//派生类一定要实现抽象基类的纯虚函数才可以创建对象
	virtual bool peek(int index, elemType& elem) { return false; };
};

class Peekback_Stack :public Stack
{
public:
	Peekback_Stack(vector<elemType>vec, int top = 0) :Stack(vec, top) {};
	virtual bool peek(int index, elemType& elem)
	{
		{
			if (index > Stack::_top)
			{
				return false;
			}
			else
			{
				elem = _stack[index];
				return true;
			}
		}
	}
};

#endif

//Stack.cpp

#include"Stack.h"


//Stack
ostream& operator<<(ostream& os, Stack& rhs)
{
	rhs.print();
	return os;
}

Stack::Stack(vector<elemType>vec, int top)
{
	_top = top;
	_stack = vec;
}

bool Stack::pop(elemType& elem)
{
	if (empty())
	{
		cout << "栈为空" << endl;
		return false;
	}
	else
	{
		//_top所指的为栈的最高且未插入元素的地方,所以 --_top所指示的地方才是此时栈的最后一个元素
		elem = _stack[--_top];
		_stack.pop_back();
		return true;
	}
}

bool Stack::push(const elemType& elem)
{
	if (full())
	{
		cout << "栈已满" << endl;
		return false;
	}
	else
	{
		_stack.push_back(elem);
		_top++;
		return true;
	}
}

bool Stack::peek(int index, elemType& elem)
{
	return false;
}

int Stack::top()const
{
	return _top;
}

int Stack::size()const
{
	return _stack.size();
}

bool Stack::empty()const
{
	if (_top == 0)
	{
		return true;
	}
	return false;
}

bool Stack::full()const
{
	if (_stack.size() == _stack.max_size())
	{
		return true;
	}
	return false;
}

void Stack::print(ostream& os)const
{
	os << "栈中的元素:" << endl;
	for (int i = 0; i < _stack.size(); i++)
	{
		os << _stack[i] << " ";
	}
	os << endl;
	os << "栈的大小:" << size() << endl;
	os << "栈指针此时的位置:" << top() << endl;
}

//main.cpp

//main.cpp

#include"Stack.h"

int main()
{
	string arr[3] =
	{
		"GodFishhh",
		"AFish",
		"Fish"
	};
	vector<string>vec(arr, arr + 3);
	LIFO_Stack Lifo(vec, vec.size());
	Peekback_Stack Peek(vec, vec.size());

	//测试LIFO_Stack类的data member
	cout << "Lifo:" << endl;
	cout << Lifo << endl;
	cout << "经过push后:" << endl;
	Lifo.push("RubFish");
	cout << Lifo << endl;
	cout << "经过pop后:" << endl;
	string temp;
	Lifo.pop(temp);
	cout << Lifo << endl;
	cout << "pop出的元素为:" << temp << endl;

	cout << "---------------------" << endl;

	//测试Peekback_Stack类的data member
	cout << "Peek:" << endl;
	cout << Peek << endl;
	cout << "经过push后:" << endl;
	Peek.push("DogFish");
	cout << Peek << endl;
	cout << "经过pop后:" << endl;
	Peek.pop(temp);
	cout << Peek << endl;
	cout << "pop出的元素为:" << temp << endl;

	cout << "使用Peekback_Stack类额外的peek()函数" << endl;
	string temp1;
	Peek.peek(0, temp1);
	cout << "peek出的元素为:" << temp1 << endl;
	system("pause");
	return 0;
}

程序运行结果:

5.3

1.是is-a关系

2.不是is-a关系

3.是is-a关系

4.是is-a关系

5.不是is-a关系,应当为has-a关系,卡车有一个(has-a)引擎

6.是is-a关系

7.是is-a关系

8.不是is-a关系

9.不是is-a关系,借书人是图书馆的成分(component)

5.4

继承体系(每次缩排都代表一个继承关系):

library_lending_material

   book

           audio book

           rental book

           CD-ROM book

  children's puppet

  record

  video

  video game

            Sege

            Sony playstation

            Nintendo

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

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

相关文章

【JavaSE专栏5】Java 基本数据类型和取值范围

作者主页&#xff1a;Designer 小郑 作者简介&#xff1a;Java全栈软件工程师一枚&#xff0c;来自浙江宁波&#xff0c;负责开发管理公司OA项目&#xff0c;专注软件前后端开发&#xff08;Vue、SpringBoot和微信小程序&#xff09;、系统定制、远程技术指导。CSDN学院、蓝桥云…

Mine Goose Duck 0.2版本发布

本次我增加了模组的1.16.5和1.18.2的适用版本&#xff0c;新增了一些职业和装扮 1.新职业 1.冒险家 你不会死于摔伤、溺水、火烧、冰冻。 2.工程师 你可以修改888范围内红石设备的状态。 3.模仿者 怪物认为你是他们的一员。 4.加拿大鹅 你会自动报警并召唤警车。 5.…

深度卷积对抗神经网络 基础 第三部分 (WGAN-GP)

深度卷积对抗神经网络 基础 第三部分 (WGAN-GP&#xff09; Wasserstein GAN with Gradient Penalty (WGAN-GP) 我们在训练对抗神经网络的时候总是出现各种各样的问题。比如说模式奔溃 (mode collapse)和 梯度消失&#xff08;vanishing gradient&#xff09;的问题。 比如说…

在linux下安装docker

文章目录 目录 文章目录 前言 一、docker 二、使用步骤 1.环境准备 2.安装 三、配置阿里云镜像加速 四、卸载 总结 前言 一、docker 镜像&#xff08;image&#xff09;&#xff1a; docker镜像就好比是一个模板&#xff0c;可以通过这个模板来创建容器服务&#xff0c;tomc…

【攻坚克难】详解k8s持久化存储数据pv、pvc存储问题

问题 如图:pod中的容器,创建一个包含文件的目录,重启pod或系统重启后,此目录及其文件都会丢失,如何保证其不会丢失? 图 1 创建包含文件的目录 方法 分析:用pv、pvc为k8s持久化存储数据是最好的选择,可解决上述问题。流程:pv → pvc → pod把创建的目录挂载到pvc上步…

路由 OSPF 优化(FA地址、路由汇总、路由过滤、区域认证、接口认证)

1.2.0 路由 OSPF 优化&#xff08;FA地址、路由汇总、路由过滤、区域认证、接口认证&#xff09; 一、FA地址 该文章介绍的FA地址说辞简单易懂&#xff1a;路由协议系列之六&#xff1a;OSPF FA地址 产生条件 ASBR在其连接外部网络的接口&#xff08;外部路由的出接口&#xf…

CS61A 2022 fall HW 01: Functions, Control

CS61A 2022 fall HW 01: Functions, Control 文章目录CS61A 2022 fall HW 01: Functions, ControlQ1: A Plus Abs BQ2: Two of ThreeQ3: Largest FactorQ4: HailstoneHW01对应的是Textbook的1.1和1.2 Q1: A Plus Abs B 题目&#xff1a; Fill in the blanks in the following f…

Java | 解决并发修改异常问题【CurrentModificationException】

今日碰到Java中的一个异常&#xff0c;名为CurrentModificationException&#xff0c;从属于RunTimeException运行时异常&#xff0c;故作此记录 异常解析 首先来说明一下什么是【并发修改异常】❓ 因为迭代器依赖集合而存在&#xff0c;因为当你在操作集合中元素的时候&#…

springboot中restful风格请求的使用

springboot中restful风格请求的使用restful风格springboot中的使用1.创建html表单页面2.在yml配置文件中开启rest表单支持3.编写controller层及对应映射处理4.启动服务&#xff0c;逐个访问restful风格 Rest风格支持&#xff08;使用HTTP请求方式动词来表示对资源的操作&#…

【手写 Vue2.x 源码】第四十二篇 - 组件部分 - 组件挂载流程简述

一&#xff0c;前言 上篇&#xff0c;组件部分-生成组件的真实节点&#xff1b; 本篇&#xff0c;组件部分-组件挂载流程分析&#xff1b; 二&#xff0c;组件挂载流程分析 1&#xff0c;示例 全局组件&#xff1a;my-button&#xff0c;name&#xff1a;‘全局组件’&…

什么是软件架构中的ASRs(架构需求文档)?

作者&#xff1a;非妃是公主 专栏&#xff1a;《软件工程》 个性签&#xff1a;顺境不惰&#xff0c;逆境不馁&#xff0c;以心制境&#xff0c;万事可成。——曾国藩 专栏地址 软件工程专栏地址 专栏系列文章 软件工程复习01&#xff1a;软件工程概述 软件工程复习02&#xf…

十大经典排序算法(动态演示+代码)-快速排序与希尔排序

快速排序 1.什么是快速排序 我们知道排序有很多种&#xff0c;常见的如希尔排序&#xff0c;插入排序&#xff0c;选择排序&#xff0c;堆排序等等&#xff0c;而快速排序也是排序家族中的一员。因为其在大多数情况下有着优秀的综合性能&#xff0c;快速排序的快速也算是实至…

结构型模式-享元模式

1.概述 运用共享技术来有效地支持大量细粒度对象的复用。它通过共享已经存在的对象来大幅度减少需要创建的对象数量、避免大量相似对象的开销&#xff0c;从而提高系统资源的利用率。 2.结构 享元&#xff08;Flyweight &#xff09;模式中存在以下两种状态&#xff1a; 内…

信息论复习—信源编码的基本方法

目录 信源编码的目的&#xff1a;提高传输效率 离散信源&#xff1a; 离散信源的分类&#xff1a; 离散无记忆信源 (DMS: Discrete Memoryless Source&#xff09;&#xff1a; 离散无记忆信源的特点&#xff1a; 离散无记忆信源编码与译码&#xff1a; 等长编码的编码速…

Day869.索引(下) -MySQL实战

索引&#xff08;下&#xff09; Hi&#xff0c;我是阿昌&#xff0c;今天学习记录的是关于索引&#xff08;下&#xff09;的内容。 先来看一下这个问题&#xff1a; 下面这个表 T 中&#xff0c;如果执行 select * from T where k between 3 and 5&#xff0c;需要执行几次…

【Java|golang】1828. 统计一个圆中点的数目

给你一个数组 points &#xff0c;其中 points[i] [xi, yi] &#xff0c;表示第 i 个点在二维平面上的坐标。多个点可能会有 相同 的坐标。 同时给你一个数组 queries &#xff0c;其中 queries[j] [xj, yj, rj] &#xff0c;表示一个圆心在 (xj, yj) 且半径为 rj 的圆。 对…

git 操作整理

git操作整理 git 配置 git config --global user.name “yuluo” git config --global user.email “1481556636qq.com” git config --global color.ui auto 启用命令行着色输出 git 操作 暂存区 git init . 初始化git仓库 git status 看仓库状态 git add index.html…

【C++】C++11简介 | 列表初始化 | 声明 | 范围for

​&#x1f320; 作者&#xff1a;阿亮joy. &#x1f386;专栏&#xff1a;《吃透西嘎嘎》 &#x1f387; 座右铭&#xff1a;每个优秀的人都有一段沉默的时光&#xff0c;那段时光是付出了很多努力却得不到结果的日子&#xff0c;我们把它叫做扎根 目录&#x1f449;C11简介&…

安装配置Ecplise插件PyDev 8.3.0

参考&#xff1a;安装Eclipse&#xff1a;https://baijiahao.baidu.com/s?id1751992697661111503&wfrspider&forpcEclipse安装PyDev&#xff1a;https://baijiahao.baidu.com/s?id1746725485069671146&wfrspider&forpc方法一&#xff1a;失败打开eclipse&…

分享138个ASP源码,总有一款适合您

ASP源码 分享138个ASP源码&#xff0c;总有一款适合您 下面是文件的名字&#xff0c;我放了一些图片&#xff0c;文章里不是所有的图主要是放不下...&#xff0c; 138个ASP源码下载链接&#xff1a;https://pan.baidu.com/s/1idRmCxILGVt5pBkac-GiiA?pwdjmmu 提取码&#x…