棧的C 陣列實現

2021-09-27 11:18:11 字數 4345 閱讀 2416

簡述:

此為c++實現簡易的棧(stack),內部資料使用指標+new的形式,算是複習下類模板的相關知識,注意點已經標記在**中。

**結構:

stack.h:定義棧的操作,由於此次實現採用了類模板,因此實現必須放在標頭檔案中。具體原因這篇文章有寫【c++中模板類的成員函式的宣告與定義應該放在標頭檔案裡】

main.cpp:測試stack類的測試樁

stack.h:

#pragma once

#includeusing namespace std;

template class stack

; type* m_item;

int m_member;

public:

//建構函式組

stack(int mem = 0);

~stack();

//運算子與拷貝建構函式

stack(const stack& stk);

stack& operator=(const stack& stk);

stack operator+(const stack& stk);

type& operator(int i) const;

//棧的基本操作

bool push(const type& item);

bool pop(type& item);

//展示部分

template friend void show(const stack& stk);

};//建構函式

//除非定義了如下所示的預設建構函式,編譯器將生成乙個stack()的建構函式

templatestack::stack(int mem)

m_member = mem;

m_item = new type[max];

if (m_item == null)

memset(m_item, 0, sizeof(type) * mem);

cout << "create " << m_member << " items\n";

return;

}//析構函式

templatestack::~stack()

//拷貝建構函式

//拷貝建構函式形如classname(const classname &)

//注意判斷是否是自身的構造。建構函式沒有返回值

templatestack::stack(const stack& stk)

this->m_member = stk.m_member;

delete this->m_item;

this->m_item = new type[m_member];

if (this->m_item == null)

memmove(this->m_item, stk.m_item, sizeof(type)*stk.m_member);

cout << "copy " << this->m_member << " items to construct new obj\n";

return;

}//賦值運算子

//原型如下:classname & classname::operator(const classname&)

templateinline stack& stack::operator=(const stack & stk)

cout << "use = to construct " << stk.m_member <<" members"<< endl;

if(this->m_item != null)

delete this->m_item;

this->m_member = stk.m_member;

this->m_item = new type[m_member];

return *this;

}//+號過載,兩棧合併,如果合併後超出,則合併失敗。

//思考:如果合併失敗,應該如何標識?(或者說如何解決?)

//返回臨時物件。

template stackstack::operator+(const stack& stk)

else }

//取值運算子

//返回值為 elementtype&型別,放方便對值進行修改,需要注意,後面一定有const,否則會出錯。

templatetype& stack::operator(int i) const

//入棧操作,外部呼叫,實際上應該判斷返回值。

templatebool stack::push(const type & item)

(*this)[m_member++] = item;

cout << "add item to this,now " << m_member << " \n";

return true;

}//出棧操作,外部呼叫同樣應該判斷返回值,注意入參需要改變,不能為const

templatebool stack::pop(type & item)

item = this->m_item[m_member-1];

m_member--;

cout << "output " << item << endl;

return true;

}//展示棧元素操作

//雖然用簡單的成員函式即可實現,但此處用友元實現,注意在類中宣告時,由於友元函式不是成員函式,因此

//需要帶上template template void show(const stack& stk)

return;

}

main.cpp:

#include#include "stack.h"

using namespace std;

int main()

cout << "press any key to continue" << endl;

cin.get();

return 0;

}

執行結果:

create 5 items01

add item to this,now 6

add item to this,now 7

2the[ 0] element is : 0

the[ 1] element is : 0

the[ 2] element is : 2

the[ 3] element is : 0

the[ 4] element is : 4

the[ 5] element is : 5

the[ 6] element is : 6

output 6

i poped 6

the[ 0] element is : 0

the[ 1] element is : 0

the[ 2] element is : 2

the[ 3] element is : 0

the[ 4] element is : 4

the[ 5] element is : 5

copy 6 items to construct new obj

the[ 0] element is : 0

the[ 1] element is : 0

the[ 2] element is : 2

the[ 3] element is : 0

the[ 4] element is : 4

the[ 5] element is : 5

*************************

create 3 items

use = to construct 6 members

the[ 0] element is : 0

the[ 1] element is : 0

the[ 2] element is : 2

the[ 3] element is : 0

the[ 4] element is : 4

the[ 5] element is : 5

copy 6 items to construct new obj

the[ 0] element is : 0

the[ 1] element is : 0

the[ 2] element is : 2

the[ 3] element is : 0

the[ 4] element is : 4

the[ 5] element is : 5

delete 6 items

delete 6 items

delete 6 items

delete 6 items

press any key to continue

棧的陣列實現(c語言

一 棧的陣列結構體typedef struct stack stack 二 建立乙個空棧stack createstack 三 入棧void push stack st,char data 四 出棧void pop stack st,char data n 五 列印棧元素void display s...

棧的陣列實現

棧是乙個先入後出的有序資料結構 filo 棧的操作操作只能是在棧頂 top 或者棧底 bottom 進行 宣告 下面的 只是乙個最基礎的實現,沒有經過嚴格的測試。使用陣列模擬棧 public class myarraystack 判斷棧是否已經滿了 public boolean isfull pub...

棧的實現 陣列

前一篇寫了鍊錶棧,這一篇寫陣列棧 首先,還是定義結構體 struct node a typedef struct node a stack a typedef intelementtype a struct node a 下面是具體實現 define eofempty 1 表示棧為空 define ...