一、实验目的
1、 熟练掌栈和队列的结构特点,掌握栈和队列的顺序存储和链式存储结构和实现。
2、 学会使用栈和队列解决实际问题。
二、实验内容
确定结点的具体数据类型和问题规模:建立一个链栈栈,实现栈的压栈和出栈操作。
三、源代码
LinkStack.h文件
template<class T>
struct Node
{
Node<T> *next;
T data;
};
template<class T>
class LinkStack
{
public:
LinkStack();//构造函数,初始化一个空链栈
~LinkStack();//析构函数,释放链栈中各节点的存储空间
void Push(T x);//入栈操作,将元素X入栈
T Pop();//出栈操作,将栈顶元素出栈
T GetTop();//取栈顶元素(并不删除)
int Empty();//判空操作,判断链栈是否为空栈
void PrintStack();//遍历栈操作
T Get(int i);//按值查找(栈底为1,栈顶为top+1)
private:
Node<T> *top;
int Length;
};
LinkStack.cpp文件
#include"LinkStack.h"
#include<iostream>
using namespace std;
template<class T>
LinkStack<T>::LinkStack()
{
top = NULL;
Length = 0;
}
template<class T>
LinkStack<T>::~LinkStack()
{
Node<T> *p =NULL;
while (top != NULL)
{
p = top->next;
delete top;
top = p;
}
}
template<class T>
void LinkStack<T>::Push(T x)
{
Node<T> *s = new Node<T>;
s->data = x;
s->next = top;
top = s;
Length++;
}
template<class T>
T LinkStack<T>::Pop()
{
if (top == NULL)
throw "下溢";
T x = top->data;
top = top->next;
Length--;
return x;
}
template<class T>
T LinkStack<T>::GetTop()
{
if (top != NULL)
{
return top->data;
}
}
template<class T>
int LinkStack<T>::Empty()
{
if (top == NULL)
{
return 1;
}
else
{
return 0;
}
}
template<class T>
void LinkStack<T>::PrintStack()
{
Node<T> *p = new Node<T>;
p = top;
while (top != NULL)
{
cout <<top->data;
top = top->next;
}
top = p;
cout << endl;
}
template<class T>
T LinkStack<T>::Get(int i)
{
Node<T> *p = new Node<T>;
p = top;
for (int k = 0; k < Length - i; k++)
{
top = top->next;
}
T m = top->data;
top = p;
return m;
}
源.cpp文件
#include"LinkStack.cpp"
#include<iostream>
using namespace std;
int main(void)
{
LinkStack<int> l1;
l1.Push(5);
l1.Push(6);
l1.Push(7);
cout << "遍历栈(从栈顶到栈底):";
l1.PrintStack();
cout << "第二个元素为:" << l1.Get(2) << endl;
cout << "栈顶元素为:" << l1.GetTop()<<endl;
l1.Pop();
l1.Pop();
cout << "两个元素出栈后,栈顶元素为:" << l1.GetTop() << endl;
cout << "栈是否为空(1/0):" << l1.Empty() << endl;
system("pause");
return 0;
}
实验截图如下:
经一一验证,结果正确
四、实验心得
通过这次实验,我对链栈有了更深入的了解,也能独立得将代码敲出来,希望以后能保持。