创作灵感:本篇博客将介绍如何使用C语言编写栈数据结构,并演示了如何将一个十进制数转换为二进制数,然后通过栈来实现反向输出二进制数。这个示例有助于初学者理解栈的基本操作和栈在数值转换中的应用。
技术笔记巩固知识要点:
-
栈的结构定义:程序使用C语言定义了一个栈结构(Stack),其中包含一个整数数组用于存储数据,以及一个指示栈顶位置的整数变量top。
-
创建空栈:createStack函数用于创建一个空栈,并返回指向栈的指针。
-
检查栈是否为空:isEmpty函数用于检查栈是否为空,如果栈顶指针top等于-1,则表示栈为空。
-
入栈操作:push函数用于将元素压入栈中。在入栈之前,需要检查栈是否已满,如果栈已满则会发生栈溢出。
-
弹出栈顶元素:pop函数用于弹出栈顶元素,并返回其值。在弹出之前,需要检查栈是否为空,如果栈为空则会发生错误。
在主函数中,程序演示了以下操作:
- 用户输入一个十进制数字。
- 将输入数字转换为二进制,并将二进制位逐个压入栈中。
- 从栈中弹出二进制位并反向打印,得到对应的二进制表示。
这个示例展示了如何使用栈来解决数值转换问题,特别是将十进制数转换为二进制数,并实现了反向输出二进制数。这对初学者来说是一个有趣且实用的示例,有助于理解栈的应用场景。同时,本示例还涵盖了动态内存分配和释放,有助于读者更好地理解内存管理的概念。
#include <stdio.h>
#include <stdlib.h>
#define SIZE 50
// 栈结构定义
typedef struct Stack {
int top;
int arr[SIZE];
} Stack;
// 创建一个空栈
Stack* createStack() {
Stack* stack = (Stack*)malloc(sizeof(Stack));
stack->top = -1;
return stack;
}
// 检查栈是否为空
int isEmpty(Stack* stack) {
return stack->top == -1;
}
// 将元素压入栈
void push(Stack* stack, int item) {
if (stack->top == SIZE - 1) {
printf("栈溢出\n");
return;
}
stack->arr[++stack->top] = item;
}
// 弹出栈顶元素
int pop(Stack* stack) {
if (isEmpty(stack)) {
printf("栈为空\n");
exit(1);
}
return stack->arr[stack->top--];
}
// 下面是主函数
int main(void) {
int num;
Stack* stack = createStack();
printf("请输入一个十进制数字:");
scanf("%d", &num);
// 将输入数值转换为二进制并压入栈
while (num != 0) {
push(stack, num % 2);
num = num / 2;
}
// 从栈中弹出元素并打印
printf("对应的二进制数为:");
while (!isEmpty(stack)) {
printf("%d", pop(stack));
}
printf("\n");
free(stack);
return 0;
}