数据结构C++边学边做--栈的链式存储结构实现

栈的链式存储结构实现

  • 一、链栈的定义
  • 二、链栈数据结构定义
  • 三、链栈类实现
    • 1.类声明
    • 2.LinkStack->构造函数
    • 3.~LinkStack->析构函数
    • 4.Push->入栈
    • 5.Pop->出栈
    • 6.GetTop->取栈顶元素
    • 7.Empty->判断链栈是否为空
  • 四、链栈的测试
    • 1.主函数
    • 2.输出结果
  • 五、源代码获取(免积分)

一、链栈的定义

  使用链式存储结构存储的栈称为链栈(linked stack)。链栈和单链表的原理是一样的,只不过在操作上链栈是受限的——仅能在栈顶进行插入和删除!链栈非空的示意图如下,链栈为空时,top=NULL。

二、链栈数据结构定义

  结点结构可使用C++中的结构体定义,另外,由于链栈中的元素类型并不确定,因此可以使用模板机制。

/*位于LinkStack.h文件中*/
/*用模板的方式定义数据结点*/
template <class ElemType>
struct Node
{
	ElemType data;
	Node<ElemType>* next;
};

三、链栈类实现

1.类声明

  用C++中的类模板来描述链栈。相关变量和方法的声明如下:

/*位于LinkStack.h文件中*/
/*链栈的类定义及方法声明*/
template <class ElemType>
class LinkStack{
	public:
		LinkStack();/*构造函数,初始化空的链栈*/
		~LinkStack();/*析构函数,释放链栈中的所有结点*/
		void Push(ElemType x);/*x入栈*/
		ElemType Pop();/*返回栈顶元素,并出栈*/
		ElemType GetTop();//获取栈顶元素 
		int Empty();//判断链栈是否为空 
	private:
		Node<ElemType>* top; 

}; 

2.LinkStack->构造函数

/*位于LinkStack.cpp文件中*/
/*构造函数*/
/*初始化空栈,只需将top指针置为NULL */
template <class ElemType>
LinkStack<ElemType>::LinkStack()
{
	top=NULL;
}

3.~LinkStack->析构函数

/*位于LinkStack.cpp文件中*/
/*析构函数*/
/*析构函数,删除每一个节点 */
template <class ElemType>
LinkStack<ElemType>::~LinkStack()
{
	while(top!=NULL)
	{
		Node<ElemType>* q=top;
		top=top->next;
		delete q;
	}
}

4.Push->入栈

/*位于LinkStack.cpp文件中*/
/*入栈*/
template <class ElemType>
void LinkStack<ElemType>::Push(ElemType x) 
{
	Node<ElemType>* s=new Node<ElemType>;
	s->data=x;
	s->next=top;
	top=s;
}

5.Pop->出栈

/*位于LinkStack.cpp文件中*/
/*出栈*/
template <class ElemType>
ElemType LinkStack<ElemType>::Pop() 
{
	if(top==NULL)
		throw "链栈为空!";
	Node<ElemType>* q;
	ElemType x=top->data;
	q=top;
	top=top->next;
	delete q;
	return x; 
}

6.GetTop->取栈顶元素

/*位于LinkStack.cpp文件中*/
/*取栈顶元素*/
template <class ElemType>
ElemType LinkStack<ElemType>::GetTop() 
{
	if(top!=NULL)
		return top->data; 
	else 
		throw "链栈为空!";
}

7.Empty->判断链栈是否为空

/*位于LinkStack.cpp文件中*/
/*判断链栈是否为空*/
template <class ElemType>
int LinkStack<ElemType>::Empty() 
{
	if(top==NULL)
		return 1; 
	else 
		return 0;
}

四、链栈的测试

1.主函数

#include 
#include "LinkStack.h"
#include "LinkStack.cpp"
using namespace std;
int  main() {
	LinkStack<int> s;
	if(s.Empty())
		cout<<"初始栈为空"<<endl;
	cout<<"元素1入栈"<<endl;
	s.Push(1);
	cout<<"元素2入栈"<<endl;
	s.Push(2);
	cout<<"元素8入栈"<<endl;
	s.Push(8);
	cout<<"栈顶元素为:"<<s.GetTop()<<endl;
	cout<<"栈顶出栈"<<endl;
	s.Pop();
	cout<<"新的栈顶元素为:"<<s.GetTop()<<endl;
	return 1; 
}

2.输出结果

初始栈为空
元素1入栈
元素2入栈
元素8入栈
栈顶元素为:8
栈顶出栈
新的栈顶元素为:2

五、源代码获取(免积分)

源代码地址

你可能感兴趣的:(数据结构C++边学边做,数据结构,c++,链栈,堆栈,链表)