实验三 栈和循环队列的表示与实现 循环队列部分
一、实验目的
掌握循环队列和链队的入队、出队基本操作。
二、实验内容
设从键盘输入一序列的字符a1,a2,a3…an。设计一个算法实现这样的功能:若ai为数字字符,ai进队;若ai为小写字母,将队首元素出队;若ai为其他字符,表示输入结束。要求使用循环队列。
头文件及宏定义:
/*CaptainUniverse_ 2022.4.1*/
#include <stdio.h>
#include <stdlib.h>
#define MAXSIZE 100
#define NUMBER 1
#define TRUE 1
#define LitLETTER 2
#define NO 0
#define FALSE 0
typedef int Status;
typedef struct
{
char *base;
int front;
int rear;
}cycleQueue;
/*CaptainUniverse_ 2022.4.1*/
子函数声明:
/*CaptainUniverse_ 2022.4.1*/
void InitQueue(cycleQueue *);//初始化循环队列
Status InsertQueue(cycleQueue *,char);//元素插入
Status DeleteQueue(cycleQueue *,char *);//元素删除
Status ischar(char);//判断是否为操作字符
/*CaptainUniverse_ 2022.4.1*/
子函数主体:
/*CaptainUniverse_ 2022.4.1*/
void InitQueue(cycleQueue *q)
{
q->base=(char *)malloc(MAXSIZE*sizeof(char));
if(!q->base)
{
exit(0);
}
q->front=q->rear=0;
}
Status InsertQueue(cycleQueue *q,char e)
{
if((q->rear+1)%MAXSIZE==q->front)
{
printf("队列已满!\n");
return FALSE;
}
q->base[q->rear]=e;
q->rear=(q->rear+1)%MAXSIZE;
return TRUE;
}
Status DeleteQueue(cycleQueue *q,char *e)
{
if(q->front==q->rear)
{
printf("队列已空!\n");
return FALSE;
}
*e=q->base[q->front];
q->front=(q->front+1)%MAXSIZE;
return TRUE;
}
Status ischar(char e)
{
if(e>='0'&&e<='9')
{
return NUMBER;
}
else if(e>='a'&&e<='z')
{
return LitLETTER;
}
else
{
return NO;
}
}
/*CaptainUniverse_ 2022.4.1*/
主函数:
/*CaptainUniverse_ 2022.4.1*/
int main()
{
cycleQueue q;
char e;
int flag;
InitQueue(&q);
do
{
flag=ischar(e=getchar());
if(flag==NUMBER)
{
if(InsertQueue(&q,e))
{
printf("入队元素:%c\n",e);
}
}
else if(flag==LitLETTER)
{
if(DeleteQueue(&q,&e))
{
printf("出队元素:%c\n",e);
}
}
}while(flag);
return 0;
}
/*CaptainUniverse_ 2022.4.1*/