用C语言写一段简单的代码:顺序栈和循环队列的定义、初始化、插入和删除操作函数, 并利用这些函数完成: 2、行编辑程序 任务:输入一行字符串,用户在输入错误时可以用#和@进行修 正,其中#为退格符,@为退行符。要求输出修正后的字符串。 要求用栈作为存储结构实现。 3、编写一个读入一个字符串,把它顺序读入队列,并输出队列 的程序。
时间: 2023-12-03 07:44:18 浏览: 97
以下是C语言实现顺序栈和循环队列的代码:
```c
#include <stdio.h>
#include <stdlib.h>
#define MAXSIZE 10 // 定义栈和队列的最大容量
// 顺序栈的定义
typedef struct {
int data[MAXSIZE];
int top; // 栈顶指针,-1表示空栈
} SqStack;
// 循环队列的定义
typedef struct {
int data[MAXSIZE];
int front; // 队头指针,指向队头元素位置的前一个位置
int rear; // 队尾指针,指向队尾元素位置
} SqQueue;
// 初始化顺序栈
void InitStack(SqStack *S) {
S->top = -1;
}
// 判断顺序栈是否为空
int StackEmpty(SqStack S) {
return S.top == -1;
}
// 判断顺序栈是否已满
int StackFull(SqStack S) {
return S.top == MAXSIZE - 1;
}
// 入栈操作
int Push(SqStack *S, int x) {
if (StackFull(*S)) {
return 0; // 栈满,插入失败
}
S->top++; // 栈顶指针加1
S->data[S->top] = x; // 将x入栈
return 1; // 插入成功
}
// 出栈操作
int Pop(SqStack *S, int *x) {
if (StackEmpty(*S)) {
return 0; // 栈空,删除失败
}
*x = S->data[S->top]; // 将栈顶元素赋值给x
S->top--; // 栈顶指针减1
return 1; // 删除成功
}
// 初始化循环队列
void InitQueue(SqQueue *Q) {
Q->front = Q->rear = 0;
}
// 判断循环队列是否为空
int QueueEmpty(SqQueue Q) {
return Q.front == Q.rear;
}
// 判断循环队列是否已满
int QueueFull(SqQueue Q) {
return (Q.rear + 1) % MAXSIZE == Q.front;
}
// 入队操作
int EnQueue(SqQueue *Q, int x) {
if (QueueFull(*Q)) {
return 0; // 队满,插入失败
}
Q->data[Q->rear] = x; // 将x入队
Q->rear = (Q->rear + 1) % MAXSIZE; // 队尾指针加1
return 1; // 插入成功
}
// 出队操作
int DeQueue(SqQueue *Q, int *x) {
if (QueueEmpty(*Q)) {
return 0; // 队空,删除失败
}
*x = Q->data[Q->front]; // 将队头元素赋值给x
Q->front = (Q->front + 1) % MAXSIZE; // 队头指针加1
return 1; // 删除成功
}
// 行编辑程序
void LineEdit() {
SqStack S;
InitStack(&S); // 初始化栈
char ch, pre_ch = 0; // pre_ch为上一个输入的字符
while ((ch = getchar()) != '\n') { // 读取一行字符串
if (ch == '#') { // 退格符
if (!StackEmpty(S)) {
Pop(&S, &pre_ch); // 删除栈顶元素
}
} else if (ch == '@') { // 退行符
while (!StackEmpty(S)) {
Pop(&S, &pre_ch); // 删除栈中所有元素
}
} else {
Push(&S, pre_ch); // 将上一个字符入栈
pre_ch = ch; // 更新上一个字符为当前字符
}
}
while (!StackEmpty(S)) {
Pop(&S, &ch); // 将栈中剩余元素弹出
putchar(ch); // 输出修正后的字符串
}
putchar('\n');
}
// 顺序读入字符串并输出队列
void ReadAndPrint() {
SqQueue Q;
InitQueue(&Q); // 初始化队列
char ch;
while ((ch = getchar()) != '\n') { // 读取字符串
EnQueue(&Q, ch); // 将字符入队
}
int x;
while (!QueueEmpty(Q)) {
DeQueue(&Q, &x); // 将队头元素出队
putchar(x); // 输出队头元素
}
putchar('\n');
}
int main() {
printf("请选择功能:\n");
printf("1. 行编辑程序\n");
printf("2. 顺序读入字符串并输出队列\n");
int choice;
scanf("%d", &choice);
getchar(); // 读取换行符
switch (choice) {
case 1:
LineEdit();
break;
case 2:
ReadAndPrint();
break;
default:
printf("无效的选择\n");
break;
}
return 0;
}
```
在行编辑程序中,当用户输入#时,我们从栈中删除栈顶元素;当用户输入@时,我们从栈中删除所有元素。当用户输入其他字符时,我们将上一个字符入栈,并将当前字符更新为上一个字符。最后,我们从栈中弹出所有剩余元素,并输出修正后的字符串。
在顺序读入字符串并输出队列的程序中,我们读取一行字符串,将每个字符入队,然后依次出队并输出每个字符。
阅读全文