聲明:筆者仍為在校學生,有錯誤之處懇請批評指正。
例子:
(需要有一點點資料結構基礎)
這就是這學期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二更