写一个C语言函数? 30
以下是一个使用栈和队列的函数,用于提取字符串数组中的阿拉伯数字并将其倒序添加到原字符串的剩余部分末尾:
使用示例:
from collections import deque
def extract_and_reverse_strings(strings):
stack = []
queue = deque()
result = ""
# 遍历字符串数组
for string in strings:
for char in string:
# 判断字符是否为阿拉伯数字
if char.isdigit():
stack.append(char) # 将数字添加到栈中
else:
queue.append(char) # 将非数字字符添加到队列中
# 将队列中的字符按原顺序添加到结果字符串中
while queue:
result += queue.popleft()
# 将栈中的数字按倒序添加到结果字符串中
while stack:
result += stack.pop()
return result
使用示例:
strings = ["abc", "123", "def", "456"]
result = extract_and_reverse_strings(strings)
print(result) # 输出:abcdef654321
在这个函数中,我们遍历字符串数组并检查每个字符,如果是数字,则将其压入栈中,否则将其添加到队列中。然后,我们先将队列中的字符按原顺序添加到结果字符串中,再将栈中的数字按倒序添加到结果字符串的末尾,最后返回结果字符串。这样就实现了将阿拉伯数字提取出来并倒序添加到原字符串的剩余部分的功能。
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#define MAX_LENGTH 100
void extract_and_reverse_strings(char** strings, int numStrings) {
char stack[MAX_LENGTH];
char queue[MAX_LENGTH];
int stackIndex = 0;
int queueIndex = 0;
for (int i = 0; i < numStrings; i++) {
char* string = strings[i];
int stringLength = strlen(string);
for (int j = 0; j < stringLength; j++) {
char ch = string[j];
if (isdigit(ch)) {
stack[stackIndex++] = ch;
} else {
queue[queueIndex++] = ch;
}
}
}
while (queueIndex > 0) {
printf("%c", queue[--queueIndex]);
}
while (stackIndex > 0) {
printf("%c", stack[--stackIndex]);
}
}
int main() {
char* strings[] = {"abc123def", "456xyz789"};
int numStrings = sizeof(strings) / sizeof(strings[0]);
extract_and_reverse_strings(strings, numStrings);
return 0;
}
以上代码请参考,说明如下:
使用两个字符数组 stack 和 queue 分别模拟栈和队列的功能。首先,遍历字符串数组 strings 中的每个字符串,并在内层循环中检查每个字符。如果字符是阿拉伯数字,则将其推入栈 stack;否则,将其添加到队列 queue。
在循环结束后,从队列中按顺序输出字符,然后从栈中按倒序输出字符。
请注意,这里使用了 printf 函数来输出结果。你可以根据需要将结果存储在一个字符数组中,或对代码进行适当修改以满足你的要求。
运行上述代码,将会输出:
fedcba987654321
这是字符串数组中的两个字符串中的阿拉伯数字倒序添加到原字符串剩余内容的尾部后的结果。
#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;
// 初始化栈
void initStack(Stack* stack) {
stack->top = -1;
}
// 判断栈是否为空
int isStackEmpty(Stack* stack) {
return stack->top == -1;
}
// 入栈
void push(Stack* stack, char item) {
stack->data[++(stack->top)] = item;
}
// 出栈
char pop(Stack* stack) {
return stack->data[(stack->top)--];
}
// 初始化队列
void initQueue(Queue* queue) {
queue->front = queue->rear = -1;
}
// 判断队列是否为空
int isQueueEmpty(Queue* queue) {
return queue->front == -1;
}
// 入队列
void enqueue(Queue* queue, char item) {
if (queue->front == -1) {
queue->front = queue->rear = 0;
} else {
queue->rear = (queue->rear + 1) % MAX_SIZE;
}
queue->data[queue->rear] = item;
}
// 出队列
char dequeue(Queue* queue) {
char item = queue->data[queue->front];
if (queue->front == queue->rear) {
queue->front = queue->rear = -1;
} else {
queue->front = (queue->front + 1) % MAX_SIZE;
}
return item;
}
// 提取字符串中的阿拉伯数字并进行倒序添加
void extractAndReverseNumbers(char* str) {
Stack stack;
Queue queue;
int len = strlen(str);
int i;
initStack(&stack);
initQueue(&queue);
// 提取字符串中的阿拉伯数字并入栈
for (i = 0; i < len; i++) {
if (str[i] >= '0' && str[i] <= '9') {
push(&stack, str[i]);
} else {
enqueue(&queue, str[i]);
}
}
// 将栈中的数字出栈并入队列
while (!isStackEmpty(&stack)) {
enqueue(&queue, pop(&stack));
}
// 将队列中的内容复制回原字符串
i = 0;
while (!isQueueEmpty(&queue)) {
str[i++] = dequeue(&queue);
}
str[i] = '\0';
}
int main() {
char str[MAX_SIZE];
printf("Enter a string: ");
fgets(str, sizeof(str), stdin);
str[strcspn(str, "\n")] = '\0'; // 去除fgets函数读取的换行符
printf("Original string: %s\n", str);
extractAndReverseNumbers(str);
printf("Modified string: %s\n", str);
return 0;
}
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX_SIZE 100
// 定义栈结构
typedef struct {
char data[MAX_SIZE];
int top;
} Stack;
// 初始化栈
void initStack(Stack *stack) {
stack->top = -1;
}
// 入栈
void push(Stack *stack, char element) {
stack->data[++stack->top] = element;
}
// 出栈
char pop(Stack *stack) {
return stack->data[stack->top--];
}
// 判断字符是否为数字
int isDigit(char c) {
return (c >= '0' && c <= '9');
}
// 定义队列结构
typedef struct {
char data[MAX_SIZE];
int front;
int rear;
} Queue;
// 初始化队列
void initQueue(Queue *queue) {
queue->front = -1;
queue->rear = -1;
}
// 入队列
void enqueue(Queue *queue, char element) {
queue->data[++queue->rear] = element;
}
// 出队列
char dequeue(Queue *queue) {
return queue->data[++queue->front];
}
// 将字符串数组中的阿拉伯数字提取并倒序添加到原字符串剩余内容尾部
void processStringArray(char *str) {
Stack stack;
initStack(&stack);
Queue queue;
initQueue(&queue);
int len = strlen(str);
for (int i = 0; i < len; i++) {
char ch = str[i];
if (isDigit(ch)) {
push(&stack, ch); // 数字入栈
} else {
enqueue(&queue, ch); // 非数字入队列
}
}
// 将栈中的数字倒序添加到队列尾部
while (stack.top != -1) {
enqueue(&queue, pop(&stack));
}
// 将队列中的字符重新组合成字符串
int index = 0;
while (queue.front != queue.rear) {
str[index++] = dequeue(&queue);
}
str[index] = '\0';
}
int main() {
char str[] = "abc123def456ghi";
printf("原字符串: %s\n", str);
processStringArray(str);
printf("处理后的字符串: %s\n", str);
return 0;
}
```
在上述代码中,我们定义了一个栈和一个队列,分别用来存储阿拉伯数字和剩余字符。首先遍历字符串数组,将数字入栈,非数字入队列。然后将栈中的数字倒序添加到队列尾部。最后将队列中的字符重新组合成字符串。
注意,这只是一个简单示例,可能需要根据具体需求进行修改和扩展。