一道作业题:OOP结构化思想与代码重用

声明:笔者仍为在校学生,有错误之处恳请批评指正。
例子:
(需要有一点点数据结构基础)
在这里插入图片描述
在这里插入图片描述
这就是这学期OOP第一节课的作业题啦 ~ 看起来很长但似乎难度不大,主要是为了让我们熟悉下代码重用 ~ 其实刚看到还是有些蒙圈的,对于我这样的新手来说还是费功夫的~ 我也不知道写的对不对,哈哈
先声明一下:
重用的基本原则:将已有的程序全盘拿过来,不改变原有的代码。另外不要自己重新造轮子,尽量利用语言本身的机制。
这是我做的作业,考虑到我的主要目的是面向和我一样的C++新手~我注释更具体一些
//stack.h栈头文件

#include <stdio.h>
#include “dlist.h”
//要包含题目中给出的头文件,和下面的cpp文件要包含这个文件是一样的
class Stack
{
private:
struct Dlist *ptrList; //栈顶指针
int stacksize;
public:
Stack();
Stack(int n); //栈的初始化
~Stack(); //栈的自动销毁
void Push(int e); //入栈
void Pop(); //出栈
int GetTop() const; //取得栈顶元素的值
}

//stack.h栈头文件的具体分析:
#include <stdio.h>
#include “dlist.h”
//要包含题目中给出的头文件,和下面的cpp文件要包含这个文件是一样的
class Stack //类名字叫Stack,一般首字母大写
{
private:
//private表示该类型的对象所私有的数据,只能通过该类型对象的成员函数访问,程序中无法直接调用(你是人,人是个对象,private相当于你的钱~只能你自己访问你的钱,别人访问就要出事情)
struct Dlist *ptrList;
//将老师给出的双链表的结构体指针当做栈顶指针,好用双链表的函数实现栈的操作。
int stacksize;
//栈的大小
public:
//public: 里面定义成员函数,就是你花钱的途径你可以通过什么函数(办法)花出去你的钱所以通过你的花钱操作就可以访问你自己的钱啦~
Stack();
//构造函数,和类型名一模一样,这个和类的初始化有关。
举个栗子:如果你声明int i;而不给初始值,那么i的值将是不确定的。如果你声明一个类,那么你需要这么一个构造函数来确认一个默认的构造~
Stack(int n);
//栈的初始化,注意到里面是有形参的,通过这个函数定义你要创建的类//(事实上,在使用对象数组时,即使是用带参数的方法初始化一个类,系统也先构造一个你所默认的类(就是上面的Stack),再把你正在构造的东西copy进去,此时程序员必须自己创建一个默认的类)。
~Stack();
//栈的自动销毁,前面加~表示析构函数,和默认函数是配套的,用完一个之后可以通过它把类自动销毁,这个函数是自动调用的不用在程序中再次手动调用它。老智能了。
void Push(int e); //入栈函数
void Pop(); //出栈函数
到此头文件就写完啦!定义了栈的初始化和基本操作,这些就是提供的公共接口的声明(public的成员函数跟C语言函数声明很像,只不过拿出来单独在一个文件里)~封装在头文件里面,接下来在Cpp文件里实现这个接口的定义就好了,也就是函数的具体实现

//stack.cpp栈的类定义实现的文件
#include <stdio.h>
#include
#include “dlist.h”
#include “Stack.h”
#define STACK_INIT_SIZE 10
#define ERROE -1
#define OK 1
using namespace std;
//使用命名空间std;
//默认的构造函数,构造一个空栈
Stack::Stack()
{
*ptrlist = NULL;
stacksize = 0;
}
//栈的初始化
Stack::Stack(int n)
{
ptrList = newDlist(n);
}
//栈的销毁
Stack::~Stack()
{
destroyDlist();
cout << “Bye, Stack!” << endl;
}
//入栈函数
void Stack::Push(int e)
{
ptrList = addFirst(ptrList, e);
stacksize++;
}
//出栈函数
void Stack::Pop()
{
ptrList = removeHead(ptrList);
stacksize–;
}
//取得栈顶元素
int Stack::GetTop() consts
{
return *ptrList.appValue;
}

这是这学期第一节课的作业题。通过这个问题我们可以看到实现一个栈或队列的数据结构再也不用像学数据结构那样写了,用双向链表就可以实现。换一步说,这体现了代码重用思想。语言或者程序库如果已经实现了一些数据结构或体制,就不要再自己造轮子了。代码重用和模块化编程还是特别方便的。在校生已经可以猜测以后的工作中少不了代码重用。
----------------------------------------------------------------------------------------------------------2020.3.4首更
队列的实现(和栈是完全类似的,不再做过多说明):
//队列
//queue.h
#include <stdio.h>
#include
#include “dlist.h”
class Queue
{
private:
struct Delist *ptrList;
struct Delist *tail;
public:
Queue();
Queue(int n); //初始化队列
~Queue(); //自动销毁队列
void InQueue(int e); //入队
void DeQueue(); //出队
void GetHead() const; //取队列头元素
void Display_num() const; //输出队列中元素的个数
void TraverseQueue() const; //遍历队列元素
}
//queue.cpp
#include
#include <stdio.h>
#include “dlist.h”
#define ERROE -1
#define OK 1
Queue::Queue()
{
*ptrList = NULL;
*tail = NULL;
}
//初始化队列
Queue::Queue(int n)
{
ptrList = newDlist(n);
tail = ptrList;
}
//自动销毁队列
Queue::~Queue()
{
destroyDlist(ptrList);
std::cout << “Bye, queue!”;
}
//入队
Queue::InQueue(int e)
{
tail = append(ptrList, e);
}
//队首元素出队
void Queue::DeQueue()
{
ptrList = removeHead(ptrList);
}
//获得队列头元素,由函数返回值返回
void Queue::GetHead() const
{
return *ptrList.appValue;
}
//输出队列中的元素个数
void Queue::Display_num() const
{
std::cout << sizeOfDlist(ptrList);
}
//遍历队列元素
void Queue::TraverseQueue() const
{
int num = sizeOfDlist(ptrList);
int i = 0;
struct Dlist *q = ptrList;
for(i; i < num; i++)
{
cout << *q.appValue;
q++;
}
}

原创文章,有纰漏之处联系修改。
另外可以关注作者的其他文章~一只软件工程在校生的学习历程全记录。
持续更新中~
----------------------------------------------------------------------------------------------------------2020.3.7二更

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值