队列的2种实现
2012-07-31 17:12 youxin 阅读(260) 评论(0) 编辑 收藏 举报队列一般有以下接口:
queue();构造函数
int empty();
void put(Item);
Item get();
链表实现如下:
#include<iostream> using namespace std; template<class Item> class Queue { private: struct node { Item item; node *next; node(Item x):item(x),next(0){} }; typedef node *Link; Link head,tail; public: Queue() { head=0;} bool empty()const { return head==0; } void put(Item x) { Link t=tail; tail=new node(x);//tail始终指向最后一项 if(head==0) head=tail; else t->next=tail; } Item get() { Link t=head; Item t2=head->item; head=head->next; delete t; return t2; } }; int main() { Queue<int> q; cout<<q.empty()<<endl; for(int i=0;i<10;i++) q.put(i); for(int i=0;i<10;i++) cout<<q.get()<<ends; }
我们设立了两个指针,head和tail,put时,使tail始终指向最后一个元素,get时,修改head。
使用数组实现,如果head%N==tail,我们认为head跟tail 重合,此时对列为空,但是如果一个put操作造成了他们相等,我们认为此时的队列为满,通常我们不检查这样的错误条件,但是我们设定数组长度的时候,会将它设为为客户将在队列中放置的元素的最大数目大1,因此我们可以为这个程序加上这样的检查。
#include<iostream> using namespace std; template<class Item> class Queue { private: Item *q; int N,head,tail; public: Queue(int maxN) { q=new Item[maxN+1]; N=maxN+1; head=N;tail=0; } int empty() const { return head%N==tail; } void put(Item item) { q[tail++]=item; tail=tail%N; } Item get() { head=head%N; return q[head++]; } }; int main() { Queue<int> q(20); for(int i=0;i<10;i++) q.put(i); cout<<q.empty()<<endl; for(int i=0;i<10;i++) cout<<q.get()<<ends; cout<<endl<<q.empty()<<endl; }
(严蔚敏教材上面是启始:Q.front=Q.rear=0。)
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
2011-07-31 让你少奋斗10年的工作经验