栈-链表模型的代码和上一篇队列的链表写法差不多,这里采用C++的方式写,使用类模板,使得栈中的数据类型可以自定义。
模型如下:
list_stack.cpp
#include <iostream>
#include "list_stack.h"
using namespace std;
template<class T> listStack<T>::listStack()
{
count = 0;
head = new _liststackNode;
head->next = NULL;
}
template<class T> listStack<T>::~listStack()
{
_liststackNode *ptr = NULL;
_liststackNode *ptmp = NULL;
ptr = head;
while (ptr->next != NULL) {
ptmp = ptr->next;
ptr->next = ptmp->next;
delete ptmp;
}
delete head;
head = NULL;
count = 0;
}
template<class T> void listStack<T>::push(const T &data)
{
if(head == NULL) {
return ;
}
_liststackNode *ptmp = new _liststackNode;
ptmp->data = data;
ptmp->next = NULL;
ptmp->next = head->next;
head->next = ptmp;
count++;
cout << "push data : " << head->next->data << endl;
}
template<class T> T listStack<T>::peek()
{
if(head->next == NULL) {
cout << "stack is empty" << endl;
return -1;
}
return head->next->data;
}
template<class T> T listStack<T>::pop()
{
if(head->next == NULL) {
cout << "stack is empty" << endl;
return -1;
}
T dat;
_liststackNode *ptmp = NULL;
ptmp = head->next;
head->next = ptmp->next;
dat = ptmp->data;
delete ptmp;
count --;
return dat;
}
template<class T> int listStack<T>::getSize() const {
return this -> count;
}
int main(int argc, char const *argv[])
{
cout << " === StackBasedOnLinkedList test begin ===" << endl;
listStack <float> stack;
cout << "size==="<<stack.getSize()<<endl;
stack.push(10.1);
stack.push(20.2);
stack.push(30.3);
stack.push(40.4);
stack.push(50.5);
stack.push(60.6);
cout << "size==="<<stack.getSize()<<endl;
cout << "stack peek " << stack.peek() << endl;
cout << "stack pop " << stack.pop() << endl;
cout << "size==="<<stack.getSize()<<endl;
cout << "stack pop " << stack.pop() << endl;
cout << "stack pop " << stack.pop() << endl;
cout << "stack pop " << stack.pop() << endl;
cout << "stack pop " << stack.pop() << endl;
cout << "stack pop " << stack.pop() << endl;
cout << "size==="<<stack.getSize()<<endl;
cout << "stack pop " << stack.pop() << endl;
cout << "stack peek " << stack.peek() << endl;
return 0;
}
list_stack.h
#ifndef LISTSTACK_H_
#define LISTSTACK_H_
template<class T> class listStack {
public:
listStack();
~listStack();
void push(const T & data);
T peek();
T pop();
int getSize() const;
private:
int count;
struct _liststackNode {
T data;
_liststackNode *next; //C++ 中struct 关键字可以省略
};
_liststackNode *head;
};
#endif