数据结构|链栈的实现(实验3.2)

来源:互联网 发布:卡尔曼滤波算法的应用 编辑:程序博客网 时间:2024/05/29 13:28

一、实验目的

1、熟练掌栈的结构特点,掌握栈的顺序存储结构和实现。

2、学会使用栈解决实际问题。

二、实验内容

1、自己确定结点的具体数据类型和问题规模,建立一个链栈,实现栈的压栈和出栈操作。

三、实验步骤

1、依据实验内容分别说明实验程序中用到的数据类型的定义;

template < typename T >class LinkStack{public:LinkStack(T array[],int n);  //构造函数~LinkStack();   //析构函数void push(T x);   //入栈操作T pop();   //出栈操作void print();   //遍历操作T gettop() { if(top!=NULL) return top->data;}   //取栈顶元素int Empty() ;   //判断是否为空private:Node <T> *top;};

2.相关操作的算法表达;

2.1 构造函数

    1.栈顶指针 top 置为 NULL 
    2.创建一个结点 node 置为 NULL 
    3.循环: 
     ①.为结点 node 申请空间 
     ②.把数组的值存储在结点 node 的 data 域中 
     ③.把栈顶指针 top 指向的结点的地址存储在 结点 node 的 next 域中 
     ④.栈顶指针 top 指向结点 node 

2.2析构函数: 
   1.创建一个结点 deleteNode 置为 NULL 
   2.循环: 
     ①.结点 deleteNode 指向栈顶结点 
     ②.栈顶指针 top 指向栈顶结点的下一个结点 
     ③.删除栈顶结点

2.3入栈操作函数: 
   1.创建一个结点 s ,申请空间 
   2.把 x 存储在结点 s 的 data 域中 
   3.结点 s 与原来的栈顶元素相连 
   4.栈顶指针 top 指向结点 s ,即结点 s 成为栈顶元素

2.4出栈操作函数: 
   1.判断是否栈空,若是则抛出“下溢”,否则 
   2.创建一个结点 p ,其指向栈顶结点 
   3.创建一个变量 x ,其记录栈顶结点存储的元素 
   4.栈顶指针 top 指向栈顶结点的下一个结点 
   5.删除栈顶结点 p  
   6.返回栈顶结点存储的元素 x

2.5输出操作函数:按照顺序,输出栈元素


3、完整程序;

由于结点元素类型不确定,因此采用C++模板机制。

源代码如下:

#include<iostream>using namespace std;template < typename T >struct Node{T data;Node<T> *next;};template < typename T >class LinkStack {public:LinkStack(T array[], int n){top = NULL;Node<T> *node = NULL;for (int i = 0; i < n; i++) {node = new Node<T>;node->data = array[i];node->next = top;top = node;}}~LinkStack(){Node<T> *deleteNode = NULL;deleteNode = top;top = top->next;delete deleteNode;}void push(T x);T pop();void print();T gettop() { if (top != NULL) return top->data; }int Empty() { top == NULL ? return 1 : return 0; }private:Node <T> *top;};
template <typename T>  bool LinkStack<T>::Empty(){      return top == NULL ? true : false;  }  
template < typename T >void LinkStack<T>::push(T x){Node<T> *s;s = new Node<T>;s->data = x;s->next = top;top = s;}template < typename T >T LinkStack<T>::pop(){T x;Node<T> *p;if (top == NULL)throw"下溢";x = top->data; p = top;top = top->next;delete p;return x;}template <class T>void LinkStack<T>::print(){Node<T> *node = top;while (node->next != NULL) {cout << node->data << " ";node = node->next;}cout << node->data << endl;}void main(){int arr[] = { 0,1,2,3,4 };cout << "创建对象:0、1、2、3、4 依次入栈 " << endl;LinkStack<int> a(arr, 5);cout << "遍历栈内的元素:";a.print();cout << "出栈一个元素" << a.pop() << "结果如下:" << endl;a.print();cout << "现在栈顶元素为:" << a.gettop();cout << "入栈元素6~10:" << endl;for (int i = 6; i <= 10; i++){a.push(i);}cout << "遍历栈内的元素:";a.print();}

4、总结、运行结果和分析。

①总结

   在程序内定义对象为int型,将元素1~5按顺序入栈。再出栈一个元素,后6~10依次入栈。

   通过调用成员函数,实现入栈、出栈、输出等基本功能。

         ②运行结果如下:


5、总体收获和不足,疑问等。

  经过上一次实验,我对栈的相关知识已经有所了解。本次试验较为简单,因为实验内容较少,且对书本知识掌握得有点熟悉。但本次试验还是发现了自己的不足之处。经过改进、询问同学,成功完成了实验。收获颇丰。总的来说,我对理论知识有了更充分的理解,也能较大程度明白运行原理。

阅读全文
0 0