帮我编写一个可以运行的有汉语操作引导的包含for循环函数的并且可以实现以下功能的一个C语言程序:1.能 利用“数组”作为存储结构方法实现“堆栈”的基本操作,包括:创建堆栈、入栈、出栈、空栈、满栈等操作。 .能 利用堆栈完成,将一组输入的数据逆序输出。能 利用“数组”作为存储结构方法实现“队列”的基本操作,包括:创建队列、入队列、出队列、队列满、队列空等基本操作。 能利用“堆栈”和“队列”,对输入的一组“字符串”判断是否“回文”
时间: 2023-06-27 09:04:12 浏览: 114
c语言中的for循环语言
以下是您需要的C语言程序,包含堆栈、队列、for循环函数和汉语操作引导。请注意,程序中的注释可以帮助您更好地理解代码的功能和操作过程。
```c
#include <stdio.h>
#include <stdbool.h> // 引入 bool 类型
#define MAX_SIZE 10 // 堆栈和队列的最大容量
// 堆栈结构体定义
struct stack {
int top; // 栈顶元素下标
int data[MAX_SIZE]; // 存储数据的数组
};
// 队列结构体定义
struct queue {
int front, rear; // 队首和队尾指针
int data[MAX_SIZE]; // 存储数据的数组
};
// 创建堆栈
void createStack(struct stack *s) {
s->top = -1; // 初始化栈顶指针
}
// 判断堆栈是否为空
bool isStackEmpty(struct stack *s) {
return (s->top == -1); // 如果栈顶指针为 -1,说明栈为空
}
// 判断堆栈是否已满
bool isStackFull(struct stack *s) {
return (s->top == MAX_SIZE-1); // 如果栈顶指针为 MAX_SIZE-1,说明栈已满
}
// 入栈
void push(struct stack *s, int item) {
if (isStackFull(s)) { // 判断栈是否已满
printf("堆栈已满,无法入栈!\n");
return;
}
s->top++; // 栈顶指针加 1
s->data[s->top] = item; // 将数据存入栈顶位置
}
// 出栈
int pop(struct stack *s) {
if (isStackEmpty(s)) { // 判断栈是否为空
printf("堆栈为空,无法出栈!\n");
return -1;
}
int item = s->data[s->top]; // 取出栈顶元素
s->top--; // 栈顶指针减 1
return item;
}
// 创建队列
void createQueue(struct queue *q) {
q->front = q->rear = -1; // 初始化队首和队尾指针
}
// 判断队列是否为空
bool isQueueEmpty(struct queue *q) {
return (q->front == -1 && q->rear == -1); // 如果队首和队尾指针都为 -1,说明队列为空
}
// 判断队列是否已满
bool isQueueFull(struct queue *q) {
return ((q->rear+1)%MAX_SIZE == q->front); // 如果队列尾部下一个位置等于队首位置,说明队列已满
}
// 入队列
void enqueue(struct queue *q, int item) {
if (isQueueFull(q)) { // 判断队列是否已满
printf("队列已满,无法入队列!\n");
return;
}
if (isQueueEmpty(q)) { // 如果队列为空,需要同时移动队首和队尾指针
q->front = q->rear = 0;
} else { // 否则只需要移动队尾指针
q->rear = (q->rear+1) % MAX_SIZE;
}
q->data[q->rear] = item; // 将数据存入队尾位置
}
// 出队列
int dequeue(struct queue *q) {
if (isQueueEmpty(q)) { // 判断队列是否为空
printf("队列为空,无法出队列!\n");
return -1;
}
int item = q->data[q->front]; // 取出队首元素
if (q->front == q->rear) { // 如果队列只有一个元素,需要同时重置队首和队尾指针
q->front = q->rear = -1;
} else { // 否则只需要移动队首指针
q->front = (q->front+1) % MAX_SIZE;
}
return item;
}
// 判断字符串是否回文
bool isPalindrome(char *str) {
struct stack s;
struct queue q;
createStack(&s); // 创建堆栈
createQueue(&q); // 创建队列
// 将字符串中的字符依次入栈和入队列
for (int i = 0; str[i] != '\0'; i++) {
push(&s, str[i]);
enqueue(&q, str[i]);
}
// 依次出栈和出队列,比较字符是否相同
while (!isStackEmpty(&s) && !isQueueEmpty(&q)) {
if (pop(&s) != dequeue(&q)) { // 如果字符不相同,说明不是回文
return false;
}
}
return true; // 如果全部字符都相同,说明是回文
}
int main() {
char str[MAX_SIZE];
printf("请输入一个字符串:");
scanf("%s", str); // 输入字符串
if (isPalindrome(str)) { // 判断字符串是否回文
printf("输入的字符串是回文!\n");
} else {
printf("输入的字符串不是回文!\n");
}
return 0;
}
```
阅读全文