用链表实现入栈,出栈等操作。
#pragma once
template <class T>
class CMyStack_list {
struct MyNode {
T data;
MyNode* pNext;
};
MyNode* pHead;
public:
CMyStack_list();
~CMyStack_list();
CMyStack_list(CMyStack_list const& other);
void clear();
bool empty() const;
void push(T const& data);
void pop();
T getTop() const{ return pHead->data; }
CMyStack_list & operator =(CMyStack_list const& srcStack);
};
template <class T>
CMyStack_list<T> & CMyStack_list<T>::operator =(CMyStack_list const& srcStack) {
clear();
if (srcStack.pHead) {
pHead = new MyNode;
pHead->data = srcStack.pHead->data;
pHead->pNext = nullptr;
MyNode* pCurOther = srcStack.pHead;
MyNode* pCurHead = pHead;
while (pCurOther->pNext) {
pCurHead->pNext = new MyNode;
pCurHead->pNext->data = pCurOther->pNext->data;
pCurHead->pNext->pNext = nullptr;
pCurOther = pCurOther->pNext;
pCurHead = pCurHead->pNext;
}
}
}
template <class T>
void CMyStack_list<T>::pop() {
MyNode* pTemp = pHead;
pHead = pHead->pNext;
delete pTemp;
}
template <class T>
void CMyStack_list<T>::push(T const& data) {
MyNode* tmpNode = new MyNode;
tmpNode->data = data;
tmpNode->pNext = pHead;
pHead = tmpNode;
}
template <class T>
bool CMyStack_list<T>::empty() const {
return pHead == nullptr;
}
template <class T>
CMyStack_list<T>::CMyStack_list(CMyStack_list const& other) {
pHead = nullptr;
if (other.pHead) {
pHead = new MyNode;
pHead->data = other.pHead->data;
pHead->pNext = nullptr;
MyNode* pCurOther = other.pHead;
MyNode* pCurHead = pHead;
while (pCurOther->pNext) {
pCurHead->pNext = new MyNode;
pCurHead->pNext->data = pCurOther->pNext->data;
pCurHead->pNext->pNext = nullptr;
pCurOther = pCurOther->pNext;
pCurHead = pCurHead->pNext;
}
}
}
template <class T>
void CMyStack_list<T>::clear() {
MyNode* tmp;
while (pHead) {
tmp = pHead;
pHead = pHead->pNext;
delete tmp;
}
}
template <class T>
CMyStack_list<T>::~CMyStack_list() {
clear();
}
template <class T>
CMyStack_list<T>::CMyStack_list() {
pHead = nullptr;
}
主函数:
#include "MyStack_list.h"
int main() {
CMyStack_list<int> myStack;
for (size_t i = 0; i < 10; i++) {
myStack.push(i + 1);
}
myStack.getTop();
myStack.pop();
for (size_t i = 0; i < 10; i++) {
printf("%d\t", myStack.getTop());
myStack.pop();
}
printf("\n");
return 0;
}