顺序栈以及链式栈的浅析

栈:一种特殊的线性表,其只允许在固定的一端进行插入和删除元素操 作。进行数据插入和删除操作的一端称为栈顶,另一端称为栈底。不含任 何元素的栈称为空栈,栈又称为后进先出的线性表

链式栈与顺序栈相比有很多优点。当栈需要动态变化时,如果使用顺序栈,如果设置过大会造成很多的资源浪费;如果过小,当栈溢出时,需要开辟一块更大的空间同时将原来栈中的元素全部拷贝过去,造成较大的时间开销。相反,用链接表示可以动态扩充栈的大小;而且可以节约内存空间。

栈特性:后进先出(LILO)特殊线性表  

栈功能:将数据从一种序列改变到另一种序列

顺序栈的出栈和进栈只能对栈顶数据进行操作

顺序栈的所有操作时间复杂度都是O(1);

下面就是对于顺序栈的代码操作:

#include<iostream>
using namespace std;
#define STACK_SIZE 10
template<class T>
class stack

{
public:
	stack()
		:_size(0)
	{}
	void push(const T&data)
	{
		if (_size == STACK_SIZE)
			return;
		_array[_size++] = data;
	}
	void pop()
	{
		--_size();
	}

	T&Top()
	{
		return _array[_size - 1];
	}
	const T&Top()const
	{
		return _array[_size - 1];
	}
	size_t Size()const
	{
		return _size;
	}
	bool Empty()const
	{
		return 0 == _size;
	}

private:
	T _array[STACK_SIZE];
	 int _size;
};
int main()
{
	stack<int> s;
	s.push(1);
	s.push(2);
	s.push(3);
	s.push(4);
	cout << s.Size() << endl;
	cout << s.Top() << endl;

}

当然链式栈是一种基于链表的存储表示

下面就是链式栈的实现及测试代码:

#include<iostream>
using namespace std;
template<class T>
class LinkNode
{
public:
	T _data;
	LinkNode *Link;
	LinkNode(const T& args, LinkNode<T> *ptr = nullptr)
	{
		_data = args;
		Link = ptr;
	}

};
template <class T>
class LinkStack
{
	LinkNode<T>*top;
public:
	LinkStack()
	{
		top = nullptr;
	}
	~LinkStack()
	{
		makeEmpty();
	}
	void push(const T&data)
	{
		top = new LinkNode<T>(data, top);
	}
	bool pop(T&x)
	{
		if (isEmpty())
			return false;
		LinkNode<T>*p = top;
		top = top->Link;
		x = p->_data;
		delete p;
		
	}
	bool getTop(T&x)const
	{
		if (isEmpty())
			return false;
		x = top->_data;
		return true;
	}
	bool isEmpty()const
	{
		return (top == nullptr) ? true : false;
	}
	int GetSize()const
	{
		LinkNode<T> *p = top;
		int k = 0;
		while (p != nullptr)
		{
		
			p = p->Link;
			++k;
		}
		return k;
	}
	void makeEmpty()
	{
		LinkNode<T>*p;
		while (top != nullptr)
		{
			p = top;
			p = p->Link;
			delete p;
		}
	}

};
void menu() {
	cout << "1.进栈" << endl;
	cout << "2.出栈" << endl;
	cout << "3.获取栈顶元素" << endl;
	cout << "4.栈置空" << endl;
	cout << "5.退出" << endl;
}
template<class T>
void function(int num, LinkStack<T> *ls) {
	switch (num) {
		int x;
	case 1:
		cin >> x;
		ls->push(x);
		break;
	case 2:
		ls->pop(x);
		break;
	case 3:
		ls->getTop(x);
		cout << x << endl;
		break;
	case 4:
		ls->makeEmpty();
		break;
	case 5:
		exit(1);
		break;
	}
}
int main(int argc, char** argv) {
	LinkStack<int> *ls = new LinkStack<int>;
	int num;
	while (true) {
		menu();
		cin >> num;
		function(num, ls);
	}
	delete ls;
	return 0;
}

猜你喜欢

转载自blog.csdn.net/Sherlock_Provence/article/details/86560381
今日推荐