簡述:
此為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 ...