请编写C程序,输入包含“I",”O",的字符串,"I"表示push新元素,"O"表示pop元素,请判断输入字符串是否合法,是否会造成堆栈段的异常
时间: 2024-10-11 20:08:40 浏览: 20
为了编写一个C程序,首先我们需要定义一个简单的堆栈结构并实现基本操作(入栈和出栈)。这里我们将使用数组作为堆栈的底层数据结构。请注意,这个示例假设堆栈大小已知,并且不会超过预设的最大值。
```c
#include <stdio.h>
#include <stdbool.h>
#define MAX_STACK_SIZE 10 // 定义堆栈最大容量
typedef struct {
char items[MAX_STACK_SIZE];
int top; // 栈顶指针
} Stack;
// 函数声明
bool is_stack_valid(Stack *stack, const char* input);
void push(Stack *stack, char item);
char pop(Stack *stack);
int main() {
Stack stack;
stack.top = -1; // 初始化为空
char input[100];
printf("请输入含有'I'和'O'的字符串(以空格分隔): ");
fgets(input, sizeof(input), stdin); // 获取用户输入
// 检查输入合法性
if (is_stack_valid(&stack, input)) {
// 执行入栈和出栈操作
for (const char* token = strtok(input, "IO "); token != NULL; token++) {
if (*token == 'I') {
push(&stack, *strtok(NULL, "IO "));
} else if (*token == 'O') {
if (stack.top != -1) {
printf("%c popped from the stack.\n", stack.items[stack.top]);
stack.top--;
} else {
printf("Invalid operation: stack is empty.\n");
}
} else {
printf("Invalid input: only 'I' and 'O' allowed.\n");
break;
}
}
} else {
printf("Invalid input: unable to maintain a valid stack.\n");
}
return 0;
}
// 判断堆栈是否有效
bool is_stack_valid(Stack *stack, const char* input) {
int i = 0;
while (input[i] != '\0') {
if (i + 1 >= MAX_STACK_SIZE) {
return false; // 堆栈已满
}
switch (input[i]) {
case 'I':
break;
case 'O':
if (stack->top == -1) {
return false; // 如果尝试弹出空栈,无效
}
i++;
break;
default:
return false; // 非'I'或'O'
}
i++;
}
return true;
}
// 入栈操作
void push(Stack *stack, char item) {
stack->items[++stack->top] = item;
}
// 出栈操作
char pop(Stack *stack) {
if (stack->top == -1) {
return '\0'; // 返回空字符表示栈空
}
return stack->items[stack->top--];
}
```
阅读全文