数列反转
#include <stdio.h>
#include <stdlib.h>
#define ERROR 0
#define OK 1
typedef struct Stack {
int *elements;
int max_size, top_index;
} Stack;
void init(Stack *s, int length) {
s->elements = (int *)malloc(sizeof(int) * length);
s->max_size = length;
s->top_index = -1;
}
int push(Stack *s, int element) {
if (s->top_index >= s->max_size - 1) {
return ERROR;
}
s->top_index++;
s->elements[s->top_index] = element;
return OK;
}
int pop(Stack *s) {
if (s->top_index < 0) {
return ERROR;
}
s->top_index--;
return OK;
}
int top(Stack *s) {
return s->elements[s->top_index];
}
// 请在下面实现判断栈是否为空的函数 empty
// 1. 在此之前,我们先定义一个 返回值为 int 类型,只有Stack 类型的指针参数 s 的函数 empty. 该函数 用来判断当前栈是不是为空,后面的数列翻转我们会用到这个函数。
// 2. 还记得怎么判断栈是否为空,只要看栈s top_index 是否小于0 即可. 如果是的话,那么就返回 1 来结束函数,
// 3.如果top_index 不是小于 0, 那就用else 返回 0 结束函数。
// 4. 这样我们就写好了 empty 函数,接下来让我们在 主函数里完成 数列翻转吧。 首先,我们先定义两个 int 类型的变量 n 和 num , n 表示输入元素的个数, num 表示
输入的元素, 定义好后再输入 n.
// 5. 接下来我们定义一个 栈 Stack 的指针变量 stack ,并 分配一个 Stack 类型 大小的内存,之后调用初始化 函数 init , 参数分别为 stack 和 n, 表示栈里最多有 n 个 元素。
// 6. 接下来我们要 循环输入 n 个数,然后依次插入到栈里。
我们先把for 写好, 借用变量 i 从1 循环到n,
int empty(Stack *s) {
if(s->top_index < 0) {
return 1;
} else {
return 0;
}
}
void clear(Stack *s) {
free(s->elements);
free(s);
}
int main() {
int n, num;
scanf("%d", &n);
Stack *stack = (Stack *)malloc(sizeof(Stack));
init(stack, n);
// 7. 接下来,我们输入一个元素记录在 num 里,然后调用 push 函数讲 num 插入到 stakc 里。
for(int i = 1; i <=n; i++) {
scanf("%d",&num);
push(stack, num);
}
// 我们把 n 个 数插入到 stack 里后,接下来把n 个数依次弹出 即可以实现数列的翻转了。
// 我们写一个 while 循环, 如果栈非空,那么就依次访问栈的元素,然后删除栈顶元素。这里我们可以调用 empty函数来 判断stack 是否为空,循环条件是栈非空。
// 我们先把while 循环写好
// 现在我们把while 写全,先调用top 函数 求出此时栈 stack 的栈顶元素并输出。
// 为了显示得 更加清晰,我们在输出后再输出个空格,然后再调用 pop 函数 把当前栈 stack 的栈顶元素删除了。
while(!empty(stack)) {
printf("%d ", top(stack));
pop(stack);
}
clear(stack);
return 0;
}