概念
“栈“是一种限制了插入和删除只能在末尾的表,因此它是后进先出的操作退化版表。当然也就简单多了,除了clear之外,他的所有操作时间复杂度都在O(1),常作为实现其他算法的辅助工具。
简单实现
它可以用任意一种线性数据结构实现,本文使用链表
#pragma once
#include<iostream>
template<typename T_data>
//栈不能随机访问,不可查找,无keyword
struct EntryStack
{
T_data _data;
EntryStack(const T_data& data):_data(data){}
};
template<typename T_data>
struct NodeStack
{
EntryStack<T_data> _entry;
NodeStack* _next;
NodeStack(const EntryStack<T_data>& entry, NodeStack* next) :_entry(entry), _next(next) {}
};
template<typename T_data>
class MyStack
{
public:
size_t size() { return _size; }
bool empty() { return _size == 0; }
NodeStack<T_data>* top() { return _top; }
NodeStack<T_data>* push(const EntryStack<T_data>& entry);
NodeStack<T_data>* pop();
bool clear();
MyStack();
~MyStack();
private:
size_t _size;
NodeStack<T_data>* _top;
private:
void print_stack();
friend void test_mystack();
};
template<typename T_data>
inline NodeStack<T_data>* MyStack<T_data>::push(const EntryStack<T_data>& entry)
{
_top = new NodeStack<T_data>(entry, _top);
_size++;
return _top;
}
template<typename T_data>
inline NodeStack<T_data>* MyStack<T_data>::pop()
{
NodeStack<T_data>* next = _top->_next;
delete _top;
_size--;
_top = next;
return _top;
}
template<typename T_data>
inline bool MyStack<T_data>::clear()
{
while (!empty())
{
pop();
}
return true;
}
template<typename T_data>
inline MyStack<T_data>::MyStack():
_size(0),_top(nullptr)
{
}
template<typename T_data>
inline MyStack<T_data>::~MyStack()
{
clear();
}
template<typename T_data>
inline void MyStack<T_data>::print_stack()
{
NodeStack<T_data>* node;
if (empty())
{
std::cout << "stack empty, exit\n";
return;
}
node = _top;
while (node)
{
std::cout << "{" << node->_entry._data << "},";
node = node->_next;
}
}
void test_mystack()
{
MyStack<int> s;
for (int i = 0; i < 20; i++)
{
s.push(i);
}
s.print_stack();
s.clear();
std::cout << std::endl;
s.print_stack();
}
它的节点不支持随机访问;不支持查找,因此不需要比较关键码,每个节点的Entry条目中也不需要包含keyword域。
测试
#include "mystack.hpp"
int main()
{
//quick_sort qsort;
//qsort.test_quick_sort();
//test_mylist();
test_mystack();
}