筆記六:基於陣列的棧的實現
阿新 • • 發佈:2018-12-25
棧
定義:後進先出的資料結構
實現一:基於陣列表示的線性表的派生棧的實現。
原理:把線性表的插入和刪除操作限制在同一端進行,即得到棧的表現形式。
操作:把陣列線性表的右端定義為棧頂。
程式碼:
template<typename T>
class stack
{
public:
virtual ~stack() {};
virtual bool empty() const = 0;
virtual int size() const = 0;
virtual T& top() = 0;
virtual void pop() = 0 ;
virtual void push(const T& theElement) = 0;
};
template<typename T>
class derivedArrayStack : private arrayList<T>, public stack<T>
{
public:
derivedArrayStack(int initialCapacity = 10) : arrayList<T>(initialCapacity) {}
bool empty() const { return arrayList<T>::empty(); }
int size() const { return arrayList<T>::size(); }
T& top() {
if (arrayList<T>::size() - 1 < 0)
{
cout << "當前棧為空棧!" << endl;
exit(-1);
}
return arrayList<T>::get(arrayList<T>::size() - 1);
}
void pop() {
if (arrayList<T>::size() - 1 < 0)
{
cout << "當前棧為空棧,不能進行刪除操作!" << endl;
exit(-1);
}
arrayList<T>::erase(arrayList<T>::size() - 1); }
void push(const T& theElement) { arrayList<T>::insert(arrayList<T>::size(), theElement); }
};
實現二:不以arrayList作為基類,直接實現陣列型棧
操作:定義一個指向棧頂的標記stackTop,棧容量標記stackLength和儲存陣列元素的指標。
程式碼:
template<typename T>
class arrayStack : public stack<T>
{
public:
arrayStack(int initialCapacity = 10);
~arrayStack() { delete[] stk; }
bool empty() const { return stackTop == -1; }
int size() const { return stackTop + 1; }
T& top();
void pop();
void push(const T& theElement);
private:
int stackTop; //當前棧頂
int arrayLength; //棧容量
T* stk; //元素陣列
};
template<typename T> arrayStack<T>::arrayStack(int initialCapacity)
{
stackTop = -1;
arrayLength = initialCapacity;
stk = new T[arrayLength];
}
template<typename T> T& arrayStack<T>::top()
{
if (stackTop == -1)
{
cout << "當前棧為空棧!" << endl;
exit(-1);
}
return stk[stackTop];
}
template<typename T> void arrayStack<T>::pop()
{
if (stackTop == -1)
{
cout << "當前棧為空棧!" << endl;
return ;
}
//T* curr = stk[stackTop];
int delTop = stackTop;
--stackTop;
stk[delTop].~T();
}
template<typename T> void arrayStack<T>::push(const T& theElement)
{
if (stackTop == arrayLength - 1) //達到棧容量,增加棧容量
{
T *tmp = new T[arrayLength * 2];
copy(stk, stk + stackTop, tmp);
stk = tmp;
arrayLength = arrayLength * 2;
}
stk[++stackTop] = theElement;
}
main()函式:
int main(int argc, char *argv[])
{
derivedArrayStack<int> DAS;
DAS.push(5);
cout << "將元素5入棧後,棧的大小:" << DAS.size() << endl;
DAS.push(4);
cout << "將元素4入棧後,棧的大小:" << DAS.size() << endl;
cout << "返回棧頂元素:" << DAS.top() << " size = "<<DAS.size()<<endl;
DAS.pop();
cout << "刪除棧頂元素後新的棧頂元素為:" << DAS.top() << " size = " << DAS.size() << endl;
cout << "\n**********************\n" << endl;
arrayStack<int> AS;
AS.push(5);
cout << "將元素5入棧後,棧的大小:" << " size: "<<AS.size() << endl;
AS.push(4);
cout << "將元素4入棧後,棧的大小:" << AS.size() << endl;
cout << "返回棧頂元素:" << AS.top() << " size = " << AS.size() << endl;
AS.pop();
cout << "刪除棧頂元素後新的棧頂元素為:" << AS.top() << " size = " << AS.size() << endl;
return 0;
}
執行: