队列的基本操作(顺序结构)C/C++

来源:互联网 发布:矩阵论杨明课后答案 编辑:程序博客网 时间:2024/06/04 23:37


顺序结构的队列,大多情况下对空间的申请比较死,想了个办法:用string形式来存储队列元素,对于new的方式,我也实在想不出够准确的申请方法。


C语言式:

#include <iostream>#include <memory.h>using namespace std;struct Queue{    char data[1024];    int front,rear ;};void initQueue(Queue *q){    q->front=q->rear=0;    memset(q->data,0,1024);}bool Isfull(Queue *q){    return q->rear==1024;}char pop(Queue *q){    return q->data[q->front++];}void push(Queue *q,char c){    q->data[q->rear++]=c;}int Isempty(Queue *q){    if(q->front==q->rear)        return 1;    return 0;}int main(){    Queue q;    initQueue(&q);    for(char i='a';i<='z';i++)    {        if(!Isfull(&q))        push(&q,i);    }    while(!Isempty(&q))    cout<<pop(&q)<<" ";    return 0;}



C++版:

注意!

realloc()的作用是对之前用malloc()/calloc()分配的空间修改大小,而不是分配新空间,realloc()修改过的空间地址和之前的相同,除非之前的地址开始的连续空间不如修改后的空间大,中这种情况下,它会在其它地方分配一块新大小的空间,并将原空间保存的内容复制到新空间中,然后释放原空间。简单的说,就是这里应该用malloc()分配新空间,而不是realloc()修改先前分配的空间。

#include <iostream>#include <memory.h>#include <stdlib.h>using namespace std;int size = 10;struct Queue{    char *data;    int front,rear ;};void initQueue(Queue *q){    q->front=q->rear=0;    q->data=(char*)calloc(size,sizeof(char));}bool Isfull(Queue *q){    return q->rear==10;}char pop(Queue *q){    return q->data[q->front++];}void push(Queue *q,char c){    q->data[q->rear++]=c;    if(q->rear>=size-1)         //如果空间不够,就用realloc重置data的空间大小    {        size=2*size;        while(!(q->data=(char*)realloc(q->data,sizeof(char))))            q->data=(char*)realloc(q->data,size*sizeof(char));    }}int Isempty(Queue *q){    if(q->front==q->rear)        return 1;    return 0;}int main(){    Queue q;    initQueue(&q);    for(char i='a';i<='z';i++)    {        push(&q,i);    }    while(!Isempty(&q))    cout<<pop(&q)<<" ";    return 0;}




#include <iostream>#include <memory.h>#include <string>using namespace std;struct Queue{    string data;//不用担心溢出了,不过感觉有点变味了    int front,rear ;};void initQueue(Queue *q){    q->front=q->rear=0;}char pop(Queue *q){    return q->data[q->front++];}void push(Queue *q,char c){    q->data.push_back(c);//因为这里用了pushback,所以感觉能实现功能但是怪怪的    q->rear++;}int Isempty(Queue *q){    if(q->front==q->rear)        return 1;    return 0;}int main(){    Queue q;    initQueue(&q);    for(char i='a';i<='z';i++)    {        push(&q,i);    }    while(!Isempty(&q))    cout<<pop(&q)<<" ";    return 0;}

主要是,我觉得上面C++的方式能够省去判满的步骤微笑

大家有好的办法的话,可以分享下。大笑



0 0
原创粉丝点击