用C语言编写队列程序

试写一程序,识别依次读入的一个以@为结束符的字符序列是否为形如‘序列1&序列2’模式的字符序列。其中序列1和序列2中都不包含字符‘&’,且序列2是序列1的逆序列。

第1个回答  推荐于2017-12-15
#include<stdio.h>
#include<stdlib.h>
#include<malloc.h>
#define TRUE 1
#define FALSE 0
#define NULL 0
#define OK 1
#define OVERFLOW 0
#define ERROR 0
typedef int QElemType;
typedef int Status;
typedef struct QNode
{
QElemType data;
QNode *next;
}*QueuePtr;
struct LinkQueue
{
QueuePtr front,rear;//队头,队尾指针
};
//函数列表
void InitQueue(LinkQueue &Q)
{//初始化一个队列
Q.front=Q.rear=(QueuePtr)malloc(sizeof(QNode));
if(!Q.front)//生成头结点失败
exit(OVERFLOW);
Q.front->next=NULL;
}
void DestoryQueue(LinkQueue &Q)
{ //销毁队列
while(Q.front)
{
Q.rear=Q.front->next;//Q.rear指向Q.front的下一个结点
free(Q.front);//释放Q.front所指结点
Q.front=Q.rear;//Q.front指向Q.front的下一个结点
}
}
void ClearQueue(LinkQueue &Q)
{ //将队列清为空
DestoryQueue(Q);//销毁队列
InitQueue(Q);//重新构造队列
}
Status QueueEmpty(LinkQueue Q)
{ //判断队列是否为空
if(Q.front->next==NULL)
return TRUE;
else return FALSE;
}
int QueueLength(LinkQueue Q)
{ //求队列的长度
int i=0;//计数器清0
QueuePtr p=Q.front;//p指向结点
while(Q.rear!=p)//p所指向的不是尾结点
{
i++;//计数器加1
p=p->next;
}
return i;
}
Status GetHead(LinkQueue Q,QElemType &e)
{ //若队列不空,则用e返回队头元素
QueuePtr p;
if(Q.front==Q.rear) return ERROR;
p=Q.front->next;//p指向队头结点
e=p->data;//将队头元素的值赋给e
return OK;
}
void EnQueue(LinkQueue &Q,QElemType e)
{ //插入元素e为队列Q的新的队尾元素
QueuePtr p;
p=(QueuePtr)malloc(sizeof(QNode));
//动态生成新结点
if(!p)
exit(OVERFLOW);
p->data=e;//将e的值赋给新结点
p->next=NULL;//新结点的指针为空
Q.rear->next=p;//原队尾结点的指针域为指向新结点
Q.rear=p;//尾指针指向新结点
}
Status DeQueue(LinkQueue &Q,QElemType &e)
{ //若队列不为空,删除Q的队头元素,用e返回其值
QueuePtr p;
if(Q.front==Q.rear)//队列为空
return ERROR;
p=Q.front->next;//p指向队头结点
e=p->data;//队头元素赋给e
Q.front->next=p->next;//头结点指向下一个结点
if(Q.rear==p)//如果删除的队尾结点
Q.rear=Q.front;//修改队尾指针指向头结点
free(p);
return OK;
}
void QueueTraverse(LinkQueue Q,void(*visit)(QElemType))
{ //对队头到队尾依次对队列中每个元素调用函数visit()
QueuePtr p;
p=Q.front->next;
while(p)
{
visit(p->data);//对p所指元素调用visit()
p=p->next;
}
printf("\n");
}
void print(QElemType e)
{
printf("%2d",e);
}
void main()
{
int i,k;
QElemType d;
LinkQueue q;
InitQueue(q);//构造一个空栈
for(i=1;i<=5;i++)
{
EnQueue(q,i);
}
printf("栈的元素为:");
QueueTraverse(q,print);
k=QueueEmpty(q);
printf("判断栈是否为空,k=%d(1:为空9;0:不为空)\n",k);
printf("将队头元素赋给d\n");
k=GetHead(q,d);
printf("队头元素为d=%d\n",d);
printf("删除队头元素:\n");
DeQueue(q,d);
k=GetHead(q,d);
printf("删除后新的队头元素为d=%d\n",d);
printf("此时队列的长度为%d\n",QueueLength(q));
ClearQueue(q);//清空队列
printf("清空队列后q.front=%u,q.rear=%u,q.front->next=%u\n",q.front,q.rear,q.front->next);
DestoryQueue(q);
printf("销毁队列后,q.front=%u,q.rear=%u\n",q.front,q.rear);本回答被网友采纳
第2个回答  2013-08-25
LZ你想学编程的话我建议去饭客网络学习,那里有专门的版块供大家交流学习,还有许多教程供大家观看,你的问题到那里可以解决

如何创建一个字符循环队列,实现字符元素入队列、出队列、显示队列元素...
您可以使用数组来实现循环队列。以下是一个简单的C语言实现,其中包括入队、出队和显示队列元素的操作:```c#include #define MAXSIZE 50typedef struct { char data[MAXSIZE]; int front; int rear;}Queue;void initQueue(Queue *q) { q->front = 0; q->rear = 0;}int isE...

C语言消息队列
发送端首先申请Key,使用msgget函数创建或打开消息队列。然后使用msgsnd函数向消息队列发送消息。该函数接受消息队列ID、消息缓冲区地址、消息正文长度以及标志位参数。当使用MSG_NOWAIT标志位时,msgsnd函数在消息队列满时将不等待,而是立即返回。接收端从消息队列中接收消息使用msgrcv函数。该函数也需要消息队列...

求一个用c语言编写的入队、出队,。。谢谢
static int Queen[8][8];static int a=1;typedef struct { int *elem;int top;}ColStack;\/\/栈:存放每一行放置皇后的列号 void InitQueen(){ int i,j;for(i = 0; i < 8; i++){ for(j = 0; j < 8; j++){ Queen[i][j] = 0;} } } int InitStack(ColStack &CS)\/\/初...

用C语言编写5行`杨辉三角~~急```
sq->rear++;sq->data[sq->rear]=1; \/\/将第一行存入队列中,第一行只有1一个元素 printf("please put in a integer number(no more then 15)!\\n\\t");scanf("%d",&num);\/\/fun()函数实现输出一行元素并计算出下一行各个元素,经过num次调用fun函数输出num层杨辉三角 for (i=0;i<num...

C语言的队列如何实现和表示
我能想到的有两种方法(假设队列元素都是int)一,用链表的方法 struct A { int n;struct A *a;} *p,*head,*rear;head=rear=NULL;\/*头指针,尾指针*\/ 添加元素:p=(struct A*)malloc(sizeof(struct A));...给新元素赋值...;rear->a=p;rear=p;当然添加第一个元素的时候要给head赋值...

C语言,环形队列
在音频处理领域,如ALSA框架,环形队列用于管理音频数据的输入与输出,防止出现缓冲溢出(Xrun)问题。环形队列以数组形式构建,包含读位置、写位置与长度三个关键参数。数组长度为5,读写位置指示数据在数组中的位置。若读写位置相同,环形队列为空。当写入数据达到数组长度时,队列被认为已满。向队列写入...

用C语言编写队列的各种基本操作,我不是非常明白:注释里有些问题:请大家...
队列中拥有的元素个数为:L=tail-head现要让排头的元素出队,则需将头指针加1。即head=head+1这时头指针向上移动一个位置,指向Q(3),表示Q(3)已出队。见图1 (b)。如果想让一个新元素入队,则需尾指针向上移动一个位置。即tail=tail+1这时Q(9)入队,见图1 (c)。当队尾已经处理在最上面...

C语言用数组实现循环队列的入队出队
if((front+1)%N==rear%N) \/\/成立则队列已满判断队列为空 if((rear==front)) \/\/成立则队列空入队(一般在入队前判断队列是否已满)\/\/将val入队que[front++]=val;front%=N;出队(一般在出队前判断队列是否为空)rear=(rear+1)%N;下一个要出队的元素(一般先判断是否为空)que[rear];...

请C语言高手帮我编写几个数据结构的小程序~(一定要用C++编写噢~)谢啦...
enQueue(q,'a'); enQueue(q,'b'); enQueue(q,'c');if(deQueue(q,e)==1)printf("出对元素为:%c\\n此时",e);numQueue(q);enQueue(q,'d'); enQueue(q,'e'); enQueue(q,'f');printf("def进队列后,");numQueue(q);printf("它的元素有:\\n");DispQueue(q);ClearQueue(q)...

c语言队列操作
pnew这个代码从队列的尾部增加新节点,然后pq->rear = pnew更新队列尾部指针。队列的数据结构形式就是由一个头front指针,一个尾rear指针来表征,items的设计是用空间换时间,涉及队列大小的操作会非常方便。队列的特征是先进先出,你给出的链式实现,其实就跟一个链表一样,链表的添加删除如果能理解了...

相似回答