C 順序棧 使用模板類

2021-09-07 20:52:25 字數 3533 閱讀 5492

一、思路:

1.用陣列儲存棧中的元素;

2.用top儲存棧頂的位置;

3.進棧:top加1,然後在陣列中的top位置插入x;

4.出棧:top減1

二、遇到問題:

1.父類中有函式為純虛函式,定義子類物件時,出現:「 *** is an abstract class」

原因:(a)一定要確保父類所有的純虛函式都要被實現,否則子類依然不能被例項化;

(b)一定要確保繼承的函式和父類宣告的虛函式的形參型別與返回值型別一致,否則父類的虛函式沒有例項化;

父類:virtual void push() 會出現 "*** referenced from" 應該是指沒有定義

原因這個是虛函式,要在父類裡面有定義才行;純虛函式則不需要在父類中定義

2.過載函式出錯:ostream

因為:友元函式在其它檔案使用和定義(宣告和定義、定義和使用在兩個不同的檔案)

要加前置說明

同時要加:

三、實現程式:

1.stack.h:

#ifndef stack_h

#define stack_h

const int maxsize = 50;

template class stack ; // 建構函式

void push(const t x); // 新元素進棧

bool pop(); // 棧頂元素出棧

virtual bool gettop(t &x) const = 0; // 讀取棧頂元素,由x返回

virtual bool isempty() const = 0; // 判斷棧空否

virtual bool isfull() const = 0; // 判斷棧滿否

virtual int getsize() const = 0; // 計算棧中元素個數

};#endif /* stack_h */

2.seqstack.h

#ifndef seqstack_h

#define seqstack_h

#include #include "stack.h"

using namespace std;

const int stackincreament = 20; // 棧溢位時擴充套件空間的增量

//類的前置宣告

template class seqstack;

//友元函式的宣告

template ostream& operator<

template class seqstack: public stack;

template seqstack::seqstack(int sz)

}template seqstack::~seqstack()

template void seqstack::overflowprocess()

// 將elements陣列中的值複製到新陣列中

for(int i = 0; i <= top; i++)

newarray[i] = elements[i];

maxsize = maxsize + stackincreament;

delete elements;

elements = newarray; // 複製陣列

}template void seqstack::push(const t x)

template bool seqstack::pop()

template bool seqstack::gettop(t &x)const

template bool seqstack::isempty()const

template bool seqstack::isfull()const

template int seqstack::getsize()const

template void seqstack::makeempty()

template ostream& operator<

3.main.cpp

#include #include "seqstack.h"

using namespace std;

int main(int argc, const char * ar**)

break;

case 2:

cout << "請輸入要進棧的元素值:" << endl;

cin >> val;

obj.push(val);

break;

case 3:

if(obj.pop())

cout << "出棧成功!" << endl;

else

cout << "出棧失敗!" << endl;

break;

case 4:

if(obj.gettop(val))

cout << "棧頂元素為:" << val << endl;

else

cout << "棧為空!" << endl;

break;

case 5:

if(obj.isempty())

cout << "棧為空!" << endl;

else

cout << "棧不為空!" << endl;

break;

case 6:

if(obj.isfull())

cout << "棧滿!" << endl;

else

cout << "棧不滿!" << endl;

break;

case 7:

int size;

size = obj.getsize();

cout << "棧中的元素個數為:" << size << endl;

break;

case 8:

obj.makeempty();

break;

case 9:

cout << obj << endl; // 過載輸出<<

break;

case 10:

finished = true;

break;

default:

cout << "輸入錯誤,請重新輸入!" << endl;

} // switch

} // while

return 0;

}

C 類模板實現順序棧

棧的抽象類的定義 template class stack 順序棧類的定義 include stack.h template class seqstack public stack 順序棧類的實現 include using namespace std template seqstack seqst...

C 棧類模板

template class stack 模板的實現 template stack stack top 1 建構函式,棧頂初始化為 1 template void stack push const t item template t stack pop template const t stack ...

棧的基本操作 順序棧的類模板定義

棧和佇列都是特殊的線性表,是限制訪問位置的線性結構 可以由順序表實現,也可以由鍊錶實現。什麼是棧 棧定義為 只允許在表的一端進行插入和刪除的線性表。允許進行插入和刪除的一端叫做棧頂 top 而另一端叫棧底 bottom 棧中沒有任何元素時,稱為空棧。設給定棧s a0,a1,an 1 稱a0為棧底,a...