queue队列的实现

因本人想规避C中较多繁杂的内容,如scanf,printf,malloc,free函数,所以比较喜欢使用C++,C++提供了很多高效的STL库,如map,queue等,今天所讲的数据结构--队列正是STL中的实现,STL中的库函数不满足于我的编程开发,故在其中增加了几个简单的函数。

首先malloc函数需要引用stdlib.h,其次需要预先知道内容的大小,需要使用sizeof,而且malloc有返回类型,使用前需要确定数据类型,末尾可能还会忘记free,但C++中提供的new可以大大降低这个问题的发生,其次C++具有自动调用析构函数的机制,只需要在析构函数内加入delete就可以自动释放内存,简单省事。

和之前一样,先讲一下queue队列是一种类似于堆栈的数据结构,但此结构就像人买饮料,有一个先付款先拿货的原则,就是我们所说的先进先出原则。

在计算器中往往需要使用队列中的元素将中缀表达式改为后缀表达式,最基本的思路就是当遍历队列中的内容(也就是输入的中缀表达式)时,往往需要先删除空格随后进行处理,当遇到数字时直接让该元素进入相应的队列,当遇到符号时利用STL中map的映射特性将+,-的优先级设为1,*,/优先级设为2,设置一个计数器,当有两个符号进入队列中比较优先级,优先级高的压入队列中,计数器记为1,若两者相等时,同时压入队列中,计数器记为0,随后将队列中临时存储的内容压入堆栈中,依据堆栈的操作完成对应的内容,代码将于下周给出

queue队列的基本操作有:压入,弹出,新建,清空,打印队列元素,取得队首元素,取得对尾元素,判定队列是否已满或者为空,返回队列的元素个数

void push(int x);

void pop();

myqueue(int len);

void clear();

void print();

TypeName getfront();

TypeName getrear();

bool IsEmpty();

bool IsFull();

int size();


C++提供了模板,但因本人还是小白故先使用C语言中的typedef将数据类型用TypeName表示,int可以用string,char,double,float等多种数据类型替代,但STL库中的内容是使用template <typename typename1>的

我们利用C++的封装型可以将其封装成以下内容

#include <iostream>
using namespace std;
typedef int TypeName;
class myqueue
{
private:
TypeName *data;
int maxsize;
int front,rear;
public:
myqueue(int len) //构造函数,创建一个队列 
{
data=new TypeName;
maxsize=len;
front=rear=-1;
cout<<"队列创建成功!"<<endl; 
}

void clear()
{
front=rear=-1;
}

void push(TypeName x)
{
data[++rear]=x;
}

void pop()
{
front++; //从对头进行读取
}

int size()
{
return rear-front;
}

TypeName getrear()
{
return data[rear];
}

TypeName getfront()
{
return data[front+1];
}

bool IsFull()
{
return (rear-front)>=maxsize;
}

bool IsEmpty()
{
return (rear==-1);
}

void print()
{
if(IsEmpty())
{
cout<<"无内容"<<endl;
return;
}
cout<<"队列中的内容是:"<<endl;
for(int i=front+1;i<rear+1;i++)
{
cout<<data[i]<<endl;
}

}

~myqueue()
{
delete data;
}
}; 

以下为测试代码:

#include <iostream>
#include "myqueue.h"
using namespace std;
typedef int TypeName;


int main()
{
int len;
cout<<"请输入队列长度"<<endl;
cin>>len;
myqueue myque(len);
TypeName a[len];
cout<<"请输入数组内容"<<endl;
for(int i=0;i<len;i++)
{
cin>>a[i];
myque.push(a[i]);
}
myque.print();
cout<<"原内容长度为:"<<myque.size()<<endl;
myque.pop();
cout<<"新长度为"<<myque.size()<<endl;
myque.print();
return 0;
}

TypeName getfront();
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值