队列和栈的链表实现
今天来介绍一下队列和链表的简单实现。
(括号里的内容可以选择性跳过:为了方便像本人一样一些比较小白的人理解,此处先介绍一些个人的理解
记类名或者一个指向类的指针等为一级,
类内部的私有成员、保护成员、共有成员为二级,如:
class list{
public:
list *p;
};
int main(){
list *q;
return 0;
}
这里的 q 就是一级,而 q 内部的 p 则为二级。
)
废话说完了上图上代码:(最后一句废话:队列是先进先出,栈先进后出)
(下标数字越小表示越早进入)
#include<iostream>
using namespace std;
class list //抽象类
{
public:
list *head,*tail,*next;
int num;
list()
{
head=tail=next=NULL;
}
virtual void store(int i)=0;
virtual int retrieve()=0;
};
class queue:public list //队列的实例化
{
public:
void store(int i);
int retrieve();
};
void queue::store(int i){ //队列的存储
list *item;
item=new queue;
if(!item){
cout<<"allocation error\n"; exit(1);
}
item->num=i;
if(tail)
tail->next=item; /*这里的tail,item是一级,next就是二级((其实最重要的是要理解列表之间的链接)如果不记得小编自己定义
的级数的概念可以返回文章开头再看一下)*/
tail=item;
item->next=NULL; //这里item为一级,next为二级
if(!head)
head=tail;
}
int queue::retrieve(){ //队列的输出
int i;
list *p;
if(!head)
{
cout<<"list empty\n";
return 0;
}
i=head->num;
p=head;
head=head->next;//我个人喜欢将这一步叫做结点的“自增”(感觉更好记,时间长了之后更有助于自己理解)
delete p;
return i;
}
class stack:public list //栈的实例化
{
public:
void store(int i);
int retrieve();
};
void stack::store(int i) //栈的存储
{
list *item;
item=new stack;
if(!item) //primary-expression基本表达
{
cout<<"Allocation error\n";
exit(1);
}
item->num=i;
if(head)
item->next=head;//这里的item,head为一级,next为二级
head=item;
if(!tail)
tail=head;
}
int stack::retrieve() //栈的输出
{
int i;
list *p;
if(!head)
{
cout<<"Allocation error\n";
return 0;
}
i=head->num;
p=head;
head=head->next;//head为一级,next为二级
delete p;
return i;
}
int main(){
list *p;
queue qb;
p=&qb;
p->store(1);
p->store(2);
p->store(3);
cout<<"queue:\n";
cout<<p->retrieve()<<" ";
cout<<p->retrieve()<<" ";
cout<<p->retrieve()<<" ";
cout<<'\n';
stack sb;
p=&sb;
p->store(1);
p->store(2);
p->store(3);
cout<<"stack:\n";
cout<<p->retrieve()<<" ";
cout<<p->retrieve()<<" ";
cout<<p->retrieve()<<" ";
return 0;
}
输出:
这次的分享到此结束。(大佬勿喷)