栈和队列及模拟实现
来源:互联网 发布:js原型 编辑:程序博客网 时间:2024/06/14 08:59
1、栈
栈作为一种数据结构,是一种只能在一端进行插入和删除操作的特殊线性表。它按照后进先出的原则存储数据。
先进入的数据被压入栈底,最后的数据在栈顶;需要读数据的时候从栈顶开始弹出数据(最后一个数据被第一个读出来)。
栈具有记忆作用,对栈的插入与删除操作中,不需要改变栈底指针。
结构比较简单,基本操作如下:
#pragma once#include<iostream>using namespace std;template<class T>class Stack{public:Stack() //构造函数:_d(NULL), _size(0), _capacity(0){} ~Stack() //析构函数{if (_d){delete _d;_d = NULL;}}public:void Push(T d) //压栈{CheckCapacity();_d[_size] = d;_size++;}void Pop() //出栈{if (Top() != NULL) //如果栈不为空{_size--;}}T& Top() //栈顶元素{return _d[_size - 1];}size_t Size() //返回栈大小{return _size;} bool Empty() //判断是否为空{return Top() == NULL;}void Display(){for (size_t i = 0; i < _size; i++){cout << _d[i] << " ";}cout << endl;}private:void CheckCapacity() //检查容量{if (_size == _capacity){size_t NewCapacity = _capacity * 2 + 3;T *tmp = new T[NewCapacity];for (size_t i = 0; i < _size; i++){tmp[i] = _d[i];}delete[] _d;_d = tmp;_capacity = NewCapacity;}}protected:T *_d;size_t _size;size_t _capacity;};void test(){Stack<int> s1;s1.Push(1);s1.Push(2);s1.Push(3);s1.Push(4);s1.Display();s1.Pop();s1.Display();cout << s1.Empty() << endl;cout << s1.Size() << endl;cout << s1.Top() << endl;}int main(){test();system("pause");return 0;}
看运行结果:
这里,1是栈底,第一个入栈,4是栈顶,弹出时从栈顶开始弹出数据(最后一个数据被第一个读出来),因此第二次打印为1,2,3
因此有三个元素,栈顶元素为3.
2.队列
队列(Queue):也是运算受限的线性表。是一种先进先出(First In First Out ,简称FIFO)的线性表。只允许在表的一端front进行插入,而在另一端rear进行删除。
队首(front) :允许进行删除的一端称为队首。
队尾(rear) :允许进行插入的一端称为队尾。
例如:排队购物。操作系统中的作业排队。先进入队列的成员总是先离开队列。
基本操作实现如下:
template<class T>class LinkQueue //队列节点{public:LinkQueue():_d(NULL),next(NULL){}LinkQueue(T& d):_d(d),next(NULL){}~LinkQueue(){}public:T _d;LinkQueue *next;};template<class T>class Queue{public:Queue():_front(NULL), _rear(NULL){}void Push(T d) //尾插{if (_front == NULL){_front = new LinkQueue<T>; //头结点_front->next= new LinkQueue<T>(d); //插入d_rear = _front->next;}else{_rear->next= new LinkQueue<int>(d);_rear = _rear->next;}}void Pop() //头删{assert(_front&&_rear);if (_front == _rear) //队列为空{return;}else{LinkQueue<int> *tmp = _front->next;_front->next = tmp->next;delete tmp;tmp = NULL;}}size_t Size() //队列节点个数{assert(this);size_t size = 0;LinkQueue<int> *tmp = _front->next;while (tmp != NULL){size++;tmp = tmp->next;}return size;}bool Empty() //队列是否为空{return _front == _rear;}T Top() //队头元素{if (!Empty()){LinkQueue<int> *tmp = _front->next;return tmp->_d;}return 0;}~Queue(){LinkQueue<int> *tmp = _front->next;while (tmp != NULL){delete _front;_front = tmp;tmp = tmp->next;}}void display(){LinkQueue<int> *tmp = _front->next;while (tmp != NULL){cout << tmp->_d << " ";tmp = tmp->next;}cout << endl;}private:LinkQueue<T> *_front;LinkQueue<T> *_rear;};void test(){Queue<int> q1;q1.Push(1);q1.Push(2);q1.Push(3);q1.Push(4);q1.display();q1.Pop();q1.display();cout << q1.Empty() << endl;cout << q1.Size() << endl;cout << q1.Top() << endl;}int main(){test();system("pause");return 0;}
分析运行结果:
队首为先入队的元素,因此Pop后剩2,3,4,元素个数为3,队首为2。
阅读全文
0 0
- 栈和队列及模拟实现
- 栈和队列,以及模拟实现
- (C++)栈和队列的模拟实现
- 模拟实现容器适配器栈和队列
- notify和notifyAll的区别及阻塞队列模拟实现
- 队列模拟栈和栈模拟队列
- 两个栈模拟一个队列和两个队列模拟一个栈(c++实现)
- Java 模拟双端链表,以链表实现栈和队列
- 用链表、顺序表模拟实现栈和队列
- Python模拟栈 和 队列
- 数组模拟队列和栈
- 链表-模拟栈和队列
- LinkedList模拟栈和队列
- 一般队列和循环队列及优先级队列的实现
- 两个栈模拟实现一个队列
- 【算法】用两个栈模拟实现队列
- 队列的模拟实现
- 模拟实现 队列
- 安卓 Activity总结
- 无缝滚动
- 求两直线的夹角
- Intellij IDEA 2017集成MyBatis三剑客
- MyBatis 框架 8
- 栈和队列及模拟实现
- 使用java完成二分算法
- java SE 知识总结
- PCA的数学原理
- 数据结构学习-指针与函数
- 初始hive
- Hibernate 简介
- 解决等值线生成过程存在的二义性
- 运用for语句来判断数组中值得大小