c语言使用字母I和O分别表示PUSH和POP操作。堆栈的初始状态和结束状态都应为空,一个PUSH和POP操作序列仅由I和O组成的序列表示。这种序列只有在具有可操作性时才是合法的,否则就是非法的。写一个算法来判断下列序列是否合法。
时间: 2024-05-14 19:12:25 浏览: 124
可以使用一个计数器来模拟堆栈的状态,当遇到字母I时,将计数器加1表示入栈,当遇到字母O时,将计数器减1表示出栈。如果计数器小于0,说明出现了非法的POP操作,如果计数器大于0,说明堆栈没有完全出栈,也是非法的。最后判断计数器是否为0即可。
具体实现如下:
```c
#include <stdio.h>
int main() {
char str[100];
int count = 0;
printf("请输入操作序列:");
scanf("%s", str);
for (int i = 0; str[i] != '\0'; i++) {
if (str[i] == 'I') {
count++;
} else if (str[i] == 'O') {
count--;
}
if (count < 0) {
printf("非法操作序列\n");
return 0;
}
}
if (count == 0) {
printf("合法操作序列\n");
} else {
printf("非法操作序列\n");
}
return 0;
}
```
测试样例:
输入:IOIOIOI
输出:合法操作序列
输入:IOIIOO
输出:非法操作序列
相关问题
c语言实现堆栈的初始化,压栈,出栈,判空操作
堆栈(Stack)是一种线性数据结构,具有“后进先出”的特点,可以使用数组或链表来实现。下面是使用数组实现堆栈的初始化、压栈、出栈和判空操作的C语言代码:
```c
#include <stdio.h>
#define MAXSIZE 100 // 定义栈的最大长度
typedef struct {
int data[MAXSIZE]; // 存储元素的数组
int top; // 栈顶指针
} Stack;
// 初始化堆栈
void InitStack(Stack *S) {
S->top = -1; // 栈顶指针初始化为-1
}
// 判断堆栈是否为空
int IsEmpty(Stack *S) {
if (S->top == -1) {
return 1; // 栈为空
} else {
return 0; // 栈不为空
}
}
// 压栈操作
void Push(Stack *S, int x) {
if (S->top == MAXSIZE - 1) {
printf("栈已满,无法插入元素!\n");
return;
}
S->data[++S->top] = x;
}
// 出栈操作
int Pop(Stack *S) {
if (S->top == -1) {
printf("栈已空,无法删除元素!\n");
return -1;
}
return S->data[S->top--];
}
```
使用方法:
```c
int main() {
Stack S;
InitStack(&S); // 初始化堆栈
Push(&S, 1); // 压入元素1
Push(&S, 2); // 压入元素2
int x = Pop(&S); // 出栈,x的值为2
printf("%d\n", x);
x = Pop(&S); // 出栈,x的值为1
printf("%d\n", x);
x = Pop(&S); // 栈已空,无法删除元素!
return 0;
}
```
在c语言中初始化一个堆栈,然后编写一个函数在堆栈顶部添加一个元素,然后编写一个函数删除堆栈顶部元素,最后编写一个函数返回堆栈顶部元素
好的,下面是在 C 语言中初始化一个堆栈,并编写添加、删除、返回顶部元素的函数的示例代码:
```c
#include <stdio.h>
#include <stdlib.h>
#define MAXSIZE 100
typedef struct Stack {
int data[MAXSIZE];
int top;
} Stack;
void initStack(Stack *s) {
s->top = -1;
}
int isStackEmpty(Stack *s) {
return s->top == -1;
}
int isStackFull(Stack *s) {
return s->top == MAXSIZE - 1;
}
void push(Stack *s, int x) {
if (isStackFull(s)) {
printf("Stack is full!\n");
exit(1);
}
s->data[++s->top] = x;
}
void pop(Stack *s) {
if (isStackEmpty(s)) {
printf("Stack is empty!\n");
exit(1);
}
s->top--;
}
int peek(Stack *s) {
if (isStackEmpty(s)) {
printf("Stack is empty!\n");
exit(1);
}
return s->data[s->top];
}
int main() {
Stack s;
initStack(&s);
push(&s, 1);
push(&s, 2);
push(&s, 3);
printf("After push: ");
while (!isStackEmpty(&s)) {
printf("%d ", peek(&s));
pop(&s);
}
printf("\n");
return 0;
}
```
在上面的代码中,我们定义了一个结构体 Stack,其中 data 数组用于存储堆栈元素,top 变量表示栈顶指针的位置。initStack 函数用于初始化堆栈,isStackEmpty 函数用于判断堆栈是否为空,isStackFull 函数用于判断堆栈是否已满。push 函数用于将元素压入堆栈,pop 函数用于弹出堆栈顶部元素,peek 函数用于获取堆栈顶部元素的值。在主函数中,我们先将元素 1、2、3 压入堆栈,然后依次弹出堆栈元素,并打印出顶部元素。
阅读全文