栈(LIFO表)

概念        

“栈“是一种限制了插入和删除只能在末尾的表,因此它是后进先出的操作退化版表。当然也就简单多了,除了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();
}

结果

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值