顺序栈和链栈的实现(实验3.1)
2017-10-16 16:10
489 查看
一、实验目的
熟练掌栈的结构特点,掌握栈的顺序存储和链式存储结构和实现。
二、实验内容
1.用C++的模板来实现顺序栈,下面是代码:
SeqStack.h
SeqStack.cpp
设计了一个输出当前栈中元素的PrintStack函数,并且给了个简单的界面,方便了调试和对栈的理解。下面是用了一些数据来测试了这个模板。
main.cpp
控制台输出如下:
2.用C++的模板来实现链栈,下面是代码:
LinkStack.h
LinkStack.cpp
以上是模板的 代码,原本也想在链栈做一个输出函数,但是由于没有完全掌握他的设计结构,写起来比较费劲,就日后再补充上去了。当然了,用模板也是为了日后继续修改,争取了写出好的模板,这样对链表的也能有更深的理解,对开发十分有好处。下面是用了一些数据来测试这个模板,先上主文件的代码。
main.h
下面是控制台中的输出。
三、总结和心得
实现顺序栈的时候比较轻松,因为数组还是挺好操作的,毕竟用了好久的数组了,加上平时开发中也很少遇到指针,除了调用一些API的必要时候需要一个指针。但是在实现链栈的时候遇到了困难,在链栈的设计上还是参考了书本上的设计。当然了,好的程序的都是改出来的,上面的代码必须不是最好的。写模板也是为了日后修改,让自己写的模板越写越好,从修改中进步。
在栈的从学习中,必须要记住,栈是先进后出的,当然这个也贯穿了上面的代码。
在空闲的时候更新的地方,大家可以捧一下场,嘿嘿~
新世界的大门 (๑•̀ㅂ•́)و✧
熟练掌栈的结构特点,掌握栈的顺序存储和链式存储结构和实现。
二、实验内容
1.用C++的模板来实现顺序栈,下面是代码:
SeqStack.h
#ifndef SeqStack_h #define SeqStack_h #include <iostream> using namespace std; const int StackSize = 100; template <class DataType> class SeqStack { public: // 构造函数 初始化一个空栈 SeqStack() { top = -1; } // 析构函数 ~SeqStack() {} // 入栈 void Push(DataType x); // 出栈 DataType Pop(); // 去栈顶元素 DataType GetTop(); // 判断是否为空 bool isEmpty() { return top == -1 ? true : false;} // 输出栈 void PrintStack(); private: DataType data[StackSize]; int top; }; #endif /* SeqStack_h */
SeqStack.cpp
#include "SeqStack.h" template <class DataType> void SeqStack<DataType>::Push(DataType x) { if (top == StackSize-1) throw "上溢"; data[++top] = x; } template <class DataType> DataType SeqStack<DataType>::Pop() { if (top == -1) throw "下溢"; DataType x = data[top--]; return x; } template <class DataType> DataType SeqStack<DataType>::GetTop() { if (top == -1) throw "空栈"; return data[top]; } template <class DataType> void SeqStack<DataType>::PrintStack() { // cout << data[top]; cout << "===" << endl; cout << "top" << endl; int p = top; while (p != 0) { cout << " " << data[p--] << endl; } cout << "===" << endl; }
设计了一个输出当前栈中元素的PrintStack函数,并且给了个简单的界面,方便了调试和对栈的理解。下面是用了一些数据来测试了这个模板。
main.cpp
#include <iostream> #include "SeqStack.cpp" int main(int argc, const char * argv[]) { SeqStack<int> stack = SeqStack<int>(); cout << "isEmpty : " << stack.isEmpty() << endl; for (int i = 0; i < 10; i++) { stack.Push(i); } stack.PrintStack(); cout << "isEmpty : " << stack.isEmpty() << endl; cout << "GetTop : " <<stack.GetTop() << endl; cout << "Pop : " << stack.Pop() << endl; cout << "Pop : " << stack.Pop() << endl; stack.PrintStack(); cout << "GetTop : " <<stack.GetTop() << endl; return 0; }
控制台输出如下:
2.用C++的模板来实现链栈,下面是代码:
LinkStack.h
#ifndef LinkStack_h #define LinkStack_h #include <iostream> using namespace std; template<class DataType> struct Node { DataType data; Node<DataType> *next; Node<DataType>(DataType x) { data = x; next = NULL; } }; template <class DataType> class LinkStack { public: // 构造函数 初始化一个空栈 LinkStack() { top = NULL; } // 析构函数 ~LinkStack() {} // 入栈 void Push(DataType x); // 出栈 DataType Pop(); // 去栈顶元素 DataType GetTop(); // 判断是否为空 bool isEmpty() { return top == NULL ? true : false;} // 输出栈 void PrintStack(); private: // 栈顶指针 Node<DataType> *top; }; #endif /* LinkStack_h */
LinkStack.cpp
#include "LinkStack.h" template <class DataType> void LinkStack<DataType>::Push(DataType x) { Node<DataType> *s = new Node<DataType>(x); s -> next = top; // 将结点插在栈顶 top = s; } template <class DataType> DataType LinkStack<DataType>::Pop() { if (top == NULL) throw "下溢"; DataType x = top -> data; Node<DataType> *p = top; top = top -> next; delete p; return x; } template <class DataType> DataType LinkStack<DataType>::GetTop() { if (top == NULL) throw "空栈"; return top -> data; } template <class DataType> void LinkStack<DataType>::PrintStack() { if (top == NULL) { cout << "空栈" << endl; return; } }
以上是模板的 代码,原本也想在链栈做一个输出函数,但是由于没有完全掌握他的设计结构,写起来比较费劲,就日后再补充上去了。当然了,用模板也是为了日后继续修改,争取了写出好的模板,这样对链表的也能有更深的理解,对开发十分有好处。下面是用了一些数据来测试这个模板,先上主文件的代码。
main.h
#include <iostream> #include "LinkStack.cpp" int main(int argc, const char * argv[]) { LinkStack<int> stack = LinkStack<int>(); for (int i = 0; i < 10; i++) { stack.Push(i); } cout << stack.isEmpty() << endl; cout << stack.GetTop() << endl; cout << "Pop : " << stack.Pop() << endl; cout << "Pop : " << stack.Pop() << endl; cout << stack.GetTop() << endl; return 0; }
下面是控制台中的输出。
三、总结和心得
实现顺序栈的时候比较轻松,因为数组还是挺好操作的,毕竟用了好久的数组了,加上平时开发中也很少遇到指针,除了调用一些API的必要时候需要一个指针。但是在实现链栈的时候遇到了困难,在链栈的设计上还是参考了书本上的设计。当然了,好的程序的都是改出来的,上面的代码必须不是最好的。写模板也是为了日后修改,让自己写的模板越写越好,从修改中进步。
在栈的从学习中,必须要记住,栈是先进后出的,当然这个也贯穿了上面的代码。
在空闲的时候更新的地方,大家可以捧一下场,嘿嘿~
新世界的大门 (๑•̀ㅂ•́)و✧
相关文章推荐
- (实验三)《数据结构》第三章 顺序栈与链栈的验证
- 顺序栈和链栈实现汉洛塔
- 数据结构|顺序栈的实现(实验3.1)
- 实验4:栈和队列的基本操作实现及其应用之《链栈》
- 数据结构|链栈的实现(实验3.2)
- 实验4:栈和队列的基本操作实现及其应用之《链栈》
- 实验4:栈和队列的基本操作实现及其应用之《链栈》
- 实验3_2 实现链栈各种基本运算的算法
- 数据结构第三章实验2.实现链栈的各种基本运算
- 实验4:栈和队列的基本操作实现及其应用——链栈
- 顺序栈和链栈实现
- 实验4:栈和队列的基本操作实现及其应用之《顺序栈》
- 数据结构——顺序栈与链栈的C++实现
- 20162322 朱娅霖 实验报告一 线性表的应用,实现和分析
- 20162326 实验一 线性表的应用,实现和分析
- NA-NP-IE系列实验50: 单臂路由实现VLAN 间路由
- 数据结构学习系列五-顺序栈(c++实现且应用模板)
- 【离散数学】【改进版】实验二 集合上二元关系性质判定的实现
- spring security 3.1 实现权限控制
- 从头认识Spring-3.1 简单的AOP日志实现-某方法之前的前后记录日志