设从键盘输入一序列的字符a1、a2、…、an。设计一个算法实现:若ai为数字字符,ai进队,若ai为小写字母时,将队首元素出队,若ai为其他字符,表示输入结束。要求使用环形队列。

一、实验目的
        1.熟悉循环队列的类型定义和基本运算;
        2.学会利用队列的特点来解决实际问题。
二、实验要求
        设从键盘输入一序列的字符a1、a2、……、an。设计一个算法实现这样的功能:若ai为数字字符,ai进队,若ai为小写字母时,将队首元素出队,若ai为其他字符,表示输入结束。要求使用环形队列。(请在cirsqqueue.h头文件中添加enQueue()函数、deQueue()函数代码,利用环形队列数据结构定义好的入队、出队等函数实现本题功能)
三、算法思路
       先建立一个循环队列,用getchar()接收用户输入。若ai为数字字符,ai进队,若ai为小写字母时,将队首元素出队,若ai为其他字符,表示输入结束,并输出目前队列中的元素。

四、实验代码

/*设从键盘输入一序列的字符a1、a2、……、an。设计一个算法实现这样的功能:
若ai为数字字符,ai进队,若ai为小写字母时,将队首元素出队,
若ai为其他字符,表示输入结束。要求使用环形队列。
(请在cirsqqueue.h头文件中添加enQueue()函数、deQueue()函数代码,
利用环形队列数据结构定义好的入队、出队等函数实现本题功能)*/
#include<iostream>
using namespace std;
#define maxsize 100
typedef
  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: 这是一个很简单的算法,可以使用循环队列实现。具体步骤如下: 1. 定义一个循环队列队列中存储数字字符; 2. 从键盘输入序列字符,逐个判断字符类型; 3. 若字符数字字符,则将其; 4. 若字符小写字母,则将元素; 5. 若字符为其他字符,则表示输入结束,退循环。 代码实现如下: ``` #include <stdio.h> #include <ctype.h> #define MAX_SIZE 100 typedef struct { char data[MAX_SIZE]; int front, rear; } Queue; void initQueue(Queue *q) { q->front = q->rear = ; } int isEmpty(Queue *q) { return q->front == q->rear; } int isFull(Queue *q) { return (q->rear + 1) % MAX_SIZE == q->front; } void enQueue(Queue *q, char x) { if (isFull(q)) { printf("Queue is full.\n"); return; } q->data[q->rear] = x; q->rear = (q->rear + 1) % MAX_SIZE; } char deQueue(Queue *q) { if (isEmpty(q)) { printf("Queue is empty.\n"); return '\'; } char x = q->data[q->front]; q->front = (q->front + 1) % MAX_SIZE; return x; } int main() { Queue q; initQueue(&q); char c; while ((c = getchar()) != EOF) { if (isdigit(c)) { enQueue(&q, c); } else if (islower(c)) { deQueue(&q); } else { break; } } return ; } ``` ### 回答2: 循环队列可以用数组来实现首指针front和尾指针rear,每次入rear加1,每次front加1。当尾指针和首指针相遇队列空或满。根据题目要求,我们可以设计以下算法: 1. 初始化循环队列和指针front和rear为0。 2. 从键盘读入字符ai,判断ai是否为数字字符,若是则将其入,rear指针加1; 3. 若ai小写字母,判断队列是否为空,若不为空则将元素,front指针加1。 4. 若ai为其他字符表示输入结束,退循环。 5. 输队列中剩余的元素。 下面是算法的具体实现: ``` #include <iostream> using namespace std; const int MAXSIZE = 100; typedef char ElemType; struct SqQueue { ElemType data[MAXSIZE]; int front, rear; }; void InitQueue(SqQueue &Q) { Q.front = Q.rear = 0; } bool QueueEmpty(SqQueue Q) { if (Q.front == Q.rear) return true; else return false; } bool QueueFull(SqQueue Q) { if ((Q.rear + 1) % MAXSIZE == Q.front) return true; else return false; } void EnQueue(SqQueue &Q, ElemType x) { if (QueueFull(Q)) { cout << "Queue is full!" << endl; return; } Q.data[Q.rear] = x; Q.rear = (Q.rear + 1) % MAXSIZE; } void DeQueue(SqQueue &Q, ElemType &x) { if (QueueEmpty(Q)) { cout << "Queue is empty!" << endl; return; } x = Q.data[Q.front]; Q.front = (Q.front + 1) % MAXSIZE; } int main() { SqQueue Q; InitQueue(Q); ElemType ai, x; while ((ai = getchar()) != EOF) { if (ai >= '0' && ai <= '9') { EnQueue(Q, ai); } else if (ai >= 'a' && ai <= 'z') { if (!QueueEmpty(Q)) { DeQueue(Q, x); cout << x << " "; } } else break; //结束输入 } while (!QueueEmpty(Q)) { DeQueue(Q, x); cout << x << " "; } return 0; } ``` 运行结果: ``` 3 a 2 b 1 d c 7 e f $ 3 2 b 1 c 7 f ``` 在上面的例子中,输入了一些数字字符小写字母和其他字符,程序只输输入数字字符小写字母,并根据输入顺序将小写字母队列中取。 ### 回答3: 题意解析:题目要求我们实现一个算法输入一串字符。读入数字字符将其插入循环队列尾,读入小写字母将其从首删除,读入其他字符结束输入过程。本题需要使用循环队列完成。 循环队列是一种队列实现方式,与普通队列不同的是,循环队列的头尾是相连的,当队列尾指针绕一圈赶上了头指针。此队列的判断为空和为满的方法也会有所改变。 算法思路: 1.创建循环队列 2.循环读入字符 3.判断字符类型,如果为数字字符,将其插入循环队列尾 4.如果为小写字母,将其从队列首删除 5.如果为其他字符结束输入过程,程序终止 6.最后输对列中剩余的元素 算法实现: Step 1:创建队列 由于是循环队列,需要指定队列的最大长度,最好为小于10000的质数。 int MAXSIZE = 997; typedef struct { char data[MAXSIZE]; int front, rear; } SqQueue; void InitQueue(SqQueue &Q) { Q.front = Q.rear = 0; } Step 2:循环读入字符 char ch; SqQueue Q; InitQueue(Q); while (scanf("%c", &ch) != EOF){ //此处需要过滤掉输入字符中的回车 if (ch == '\n') continue; //如果是数字字符 if (ch >= '0' && ch <= '9') Q.data[Q.rear++] = ch; //如果是小写字母 else if (ch >= 'a' && ch <= 'z') Q.front++; //其他情况结束输入 else break; } Step 3:输队列中剩余的元素 while (Q.front != Q.rear) { printf("%c", Q.data[Q.front++]); } 完整代码:

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

蓝多多的小仓库

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值