实现简单的队和栈结构,附代码,图
2016-04-07 13:19
302 查看
</pre><span style="font-size:18px;">数据结构相信大家都不陌生<img alt="大笑" src="http://static.blog.csdn.net/xheditor/xheditor_emot/default/laugh.gif" />,经过了多操作多类别的链表,下来是比较简单的栈和队列,栈(FILO),队列(FIFO). </span><p></p><p></p><p><span style="font-size:18px;"><strong>1.栈结构.</strong></span></p><p><span style="font-size:18px;">栈呢,类似于顺序表,可以将你的数据压栈,相当于压在你所创的顺序表的[0]下标处,_top指向你最后一个元素的下一位置。说白了就是对一个动态数组进行操作,_top和定义的_capacity,还有增容函数比较重要,掌握这些就可以编写简单的栈啦。</span></p><p><span style="font-size: 18px;">数据入栈,你的_top就得向上走一位啦,相对的pop一个数据时,_top就得相应的减1。</span></p><p><span style="font-size:18px;">如下图:</span></p><p><img src="http://img.blog.csdn.net/20160407131937184?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="" /></p><p><span style="font-size:18px;">来到代码段</span>:</p><p><pre name="code" class="cpp"><span style="font-size:18px;"><span style="font-size:18px;"></span></span><pre name="code" class="cpp">#include<iostream> #include<assert.h> using namespace std;
<span style="font-size:18px;">template <class T> class stack { public: stack():_top(0),_capacity(0),a(NULL) {}//将对象成员初始化 ~stack() { delete[] a; _top = 0; _capacity = 0; } void checkCapacity() { if(_top==_capacity)//判断容量是否够用,不够则按照下面规则进行增容 { T *temp = new T[_capacity*2+1]; _capacity=_capacity*2+1; memcpy(temp,a,sizeof(T)*_top);//将原来的复制到新增容空间 delete[] a; a = temp;//使原来的指针指向增容后的空间 } else return; } void push(T x) { checkCapacity();//进行是否需要增容的判断 if(_top<=_capacity)//容量够用进行插入 { a[_top++]=x; } } void pop() { assert(_top>0);//断言_top>0 _top--; } void display() { while(_top) { cout<<a[_top-1]<<"->"; //_top 指向最后一个数字的后一位 _top--; } cout<<"Nul"<<endl; } private: T *a; int _top; size_t _capacity; }; int main() { stack<int> sc; sc.push(1); sc.push(2); sc.push(3); sc.push(4); sc.push(5); sc.push(6); sc.push(6); sc.pop(); sc.display(); return 0; } </span>2.队列
队列的理解呢,就好比你去食堂打饭,有个先来后到的顺序,你先来那你必定先买到饭,后来的肯定后买到喽。通过概念的理解,这种结构用一个单链表就可以很好的解决问题了,实现先进先出。(注意_head和_tail的操作)
图解:
话不多说上代码:
#include<iostream> #include<assert.h> using namespace std; template<class T> struct Node { Node(const T &x):_data(x),_next(NULL) {} T _data; Node<T>* _next; };//定义一个节点的结构体 template<class T> class deque { public: deque():_head(NULL),_tail(NULL) {}//将头尾初始化 void push(const T &x) { if(_head==NULL)//判断头是否为空 { _head = new Node<T>(x); _tail = _head; } else { Node<T> *tmp; tmp = new Node<T>(x); _tail->_next= tmp; _tail = tmp;//进行尾插 } } void pop() { assert(_head!=NULL);//头不能为空 if(_head == _tail)//只有一个节点 { delete _head; _head = _tail = NULL; } Node<T> *tmp = _head;//定义一个临时变量保存当前头节点 _head = _head->_next; delete tmp; } T& GetTail() { return _tail->_data; } void display() { assert(_head!=NULL); while(_head) { cout<<_head->_data<<"->"; _head=_head->_next; } cout<<"Nul"<<endl; } private: Node<T> *_head; Node<T> *_tail; }; int main() { deque<int> d1; d1.push(1); d1.push(2); d1.push(3); d1.push(4); d1.push(5); d1.push(6); d1.pop(); d1.display(); int t = d1.GetTail(); cout<<t<<endl; return 0; }
相关文章推荐
- Spring技术内幕——深入解析Spring架构与设计原理(一)IOC实现原理
- .NET 通过代码创建带属性的XML文档
- java web程序升级jsp页面缓存无法显示最新的内容
- python迭代器
- 五个最佳编程字体
- php 根据指定的键对多维数组进行排序
- django manage.py Unknown command: 'runfcgi'
- C++作业3
- Eclipse 的 Debug 介绍与技巧
- c++ PrimerPlus 第六版中文版编程习题答案
- Eclipse 的 git 插件操作 "代码提交"以及"代码冲突"
- Java Web log4j (日志)
- QT中QPainter的使用及矩形、圆形等常见图形的画法
- java算法之身份证号码验证
- Python:IOError: image file is truncated 的解决办法
- hdu 1533 Going Home(zkw费用流)
- 第1课 学习 C++ 的意义
- C#原生加密方法: System.Security.Cryptography.CryptoStream DataSet加密解密
- C# 制作ZIP压缩包
- 第四次程序设计作业 C++计算器计算及命令行的使用 前缀表达式方法实现