帮我编写一个可以运行的有中文操作指引的包含循环函数并且可以实现以下功能的一个C语言程序:1.能 利用“数组”作为存储结构方法实现“堆栈”的基本操作,包括:创建堆栈、入栈、出栈、空栈、满栈等操作。 2.能 利用堆栈完成,将一组输入的数据逆序输出。依次入栈的数据如下:a b c d e f,依次出栈的数据如下:f e d c b a 3.能 利用“数组”作为存储结构方法实现“队列”的基本操作,包括:创建队列、入队列、出队列、队列满、队列空等基本操作。 4. 能利用“堆栈”和“队列”,对输入的一组“字符串”判断是否“回文”
时间: 2023-06-27 20:05:01 浏览: 110
好的,以下是一个实现上述功能的C语言程序:
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX_SIZE 100
// 堆栈结构体
typedef struct {
int top; // 栈顶指针
char data[MAX_SIZE]; // 栈中数据
} Stack;
// 队列结构体
typedef struct {
int front, rear; // 队首和队尾指针
char data[MAX_SIZE]; // 队列中数据
} Queue;
// 创建堆栈
Stack* create_stack() {
Stack* s = (Stack*)malloc(sizeof(Stack));
s->top = -1;
return s;
}
// 入栈
void push(Stack* s, char c) {
if (s->top == MAX_SIZE - 1) { // 判断栈是否满
printf("Stack overflow!\n");
return;
}
s->data[++(s->top)] = c;
}
// 出栈
char pop(Stack* s) {
if (s->top == -1) { // 判断栈是否空
printf("Stack underflow!\n");
return '\0';
}
return s->data[(s->top)--];
}
// 判断栈是否空
int is_empty_stack(Stack* s) {
return s->top == -1;
}
// 判断栈是否满
int is_full_stack(Stack* s) {
return s->top == MAX_SIZE - 1;
}
// 创建队列
Queue* create_queue() {
Queue* q = (Queue*)malloc(sizeof(Queue));
q->front = q->rear = -1;
return q;
}
// 入队列
void enqueue(Queue* q, char c) {
if ((q->rear + 1) % MAX_SIZE == q->front) { // 判断队列是否满
printf("Queue overflow!\n");
return;
}
q->rear = (q->rear + 1) % MAX_SIZE;
q->data[q->rear] = c;
if (q->front == -1) q->front = q->rear;
}
// 出队列
char dequeue(Queue* q) {
if (q->front == -1) { // 判断队列是否空
printf("Queue underflow!\n");
return '\0';
}
char c = q->data[q->front];
if (q->front == q->rear) q->front = q->rear = -1;
else q->front = (q->front + 1) % MAX_SIZE;
return c;
}
// 判断队列是否空
int is_empty_queue(Queue* q) {
return q->front == -1;
}
// 判断队列是否满
int is_full_queue(Queue* q) {
return (q->rear + 1) % MAX_SIZE == q->front;
}
// 将一组输入的数据逆序输出
void reverse_input() {
Stack* s = create_stack();
char c;
printf("Please input a string: ");
while ((c = getchar()) != '\n') { // 逐个字符读入
push(s, c);
}
printf("Reversed string: ");
while (!is_empty_stack(s)) { // 逐个字符出栈并输出
printf("%c", pop(s));
}
printf("\n");
}
// 判断输入的字符串是否回文
int is_palindrome() {
Queue* q = create_queue();
Stack* s = create_stack();
char str[MAX_SIZE];
printf("Please input a string: ");
scanf("%s", str);
int len = strlen(str);
for (int i = 0; i < len; i++) { // 将字符串中的字符入队列和入栈
enqueue(q, str[i]);
push(s, str[i]);
}
while (!is_empty_queue(q) && !is_empty_stack(s)) { // 逐个字符出队列和出栈进行比较
if (dequeue(q) != pop(s)) return 0;
}
return 1;
}
int main() {
int choice;
do {
printf("Please choose an operation:\n");
printf("1. Reverse input string\n");
printf("2. Check if a string is palindrome\n");
printf("3. Quit\n");
scanf("%d", &choice);
switch (choice) {
case 1:
reverse_input();
break;
case 2:
if (is_palindrome()) printf("The string is palindrome.\n");
else printf("The string is not palindrome.\n");
break;
case 3:
printf("Goodbye!\n");
break;
default:
printf("Invalid choice!\n");
break;
}
} while (choice != 3);
return 0;
}
```
程序实现了四个函数:`create_stack`、`push`、`pop`、`is_empty_stack`、`is_full_stack`,这些函数实现了堆栈的基本操作;`create_queue`、`enqueue`、`dequeue`、`is_empty_queue`、`is_full_queue`,这些函数实现了队列的基本操作;`reverse_input`函数利用堆栈将输入的字符串逆序输出;`is_palindrome`函数利用堆栈和队列判断输入的字符串是否回文。主函数利用菜单循环实现了程序的交互式操作,用户可以根据菜单选择需要执行的操作。
阅读全文