C语言栈的数制转换的定义讲解

简介: C语言栈的数制转换的定义讲解

数制转换(比如二进制转十进制,或者十进制转其他进制)通常可以使用栈来辅助完成,尤其是十进制转其他进制时。以下以十进制转二进制为例,解释如何利用栈进行数制转换,并提供相关的C语言代码。

十进制转二进制原理

将一个十进制数转换成二进制数,通常采用不断除以2取余数的方法。具体来说,每次将十进制数除以2,取余数(这个余数是二进制数的一位),然后将商继续除以2,直到商为0为止。最后,将每次得到的余数从低位到高位依次排列,即可得到该数的二进制表示。

使用栈辅助转换

由于我们需要从低位到高位依次排列余数,所以可以使用栈这种后进先出(LIFO)的数据结构来存储每次的余数。每次取余数后,先将余数压入栈中,最后再将栈中的元素依次弹出,即可得到正确的二进制序列。

C语言代码实现

 

#include <stdio.h> 

 

#include <stdlib.h> 

 

#include <stdbool.h> 

 

 

 

// 定义栈的最大容量

 

#define MAX_STACK_SIZE 100

 

 

 

// 定义栈的结构体

 

typedef struct {

 

int top;

 

int data[MAX_STACK_SIZE];

 

} Stack;

 

 

 

// 初始化栈

 

void initStack(Stack *s) {

 

s->top = -1;

 

}

 

 

 

// 判断栈是否为空

 

bool isEmpty(Stack *s) {

 

return s->top == -1;

 

}

 

 

 

// 入栈操作

 

bool push(Stack *s, int value) {

 

if (s->top >= MAX_STACK_SIZE - 1) {

 

return false; // 栈满,无法入栈

 

}

 

s->data[++s->top] = value;

 

return true;

 

}

 

 

 

// 出栈操作

 

bool pop(Stack *s, int *value) {

 

if (isEmpty(s)) {

 

return false; // 栈空,无法出栈

 

}

 

*value = s->data[s->top--];

 

return true;

 

}

 

 

 

// 十进制转二进制函数

 

void decimalToBinary(int decimal) {

 

Stack s;

 

initStack(&s);

 

 

 

while (decimal > 0) {

 

int remainder = decimal % 2; // 取余数

 

push(&s, remainder); // 将余数压入栈中

 

decimal /= 2; // 更新十进制数

 

}

 

 

 

// 弹出栈中元素并打印,得到二进制数

 

printf("Binary: ");

 

while (!isEmpty(&s)) {

 

int value;

 

pop(&s, &value);

 

printf("%d", value);

 

}

 

printf("\n");

 

}

 

 

 

int main() {

 

int decimal;

 

printf("Enter a decimal number: ");

 

scanf("%d", &decimal);

 

decimalToBinary(decimal);

 

return 0;

 

}

代码解释

 

首先定义了一个栈的结构体Stack,包含了一个指向栈顶的top变量和一个用于存储元素的数组data

initStack函数用于初始化栈,将栈顶指针设为-1。

 

isEmpty函数用于判断栈是否为空。

pushpop函数分别用于执行入栈和出栈操作。

decimalToBinary函数实现了十进制转二进制的逻辑。通过不断取余数并压入栈中,最后依次弹出栈中元素并打印,得到二进制数。

main函数中读取用户输入的十进制数,并调用decimalToBinary函数进行转换和打印。

运行这段代码,输入一个十进制数,程序会输出对应的二进制数。

 

目录
相关文章
|
22天前
|
C语言
|
1月前
|
C语言
C语言学习记录——枚举(定义、与结构体的区别、优点)
C语言学习记录——枚举(定义、与结构体的区别、优点)
23 3
|
18天前
|
存储 C语言
C语言中的typedef关键字:为类型定义新名称
C语言中的typedef关键字:为类型定义新名称
17 0
|
20天前
|
编译器 C语言 C++
【海贼王编程冒险 - C语言海上篇】自定义类型:结构体,枚举,联合怎样定义?如何使用?
【海贼王编程冒险 - C语言海上篇】自定义类型:结构体,枚举,联合怎样定义?如何使用?
10 0
|
1月前
|
C语言 C++
【数据结构】C语言实现:栈(Stack)与队列(Queue)
【数据结构】C语言实现:栈(Stack)与队列(Queue)
|
1月前
|
C语言
C语言学习记录——矩阵转换(定义一个数组实现或定义两个数组实现)
C语言学习记录——矩阵转换(定义一个数组实现或定义两个数组实现)
15 0
|
1月前
数据结构——栈(C语言版)
数据结构——栈(C语言版)
14 0
|
2月前
|
存储 算法 编译器
C语言中的二维数组:定义与初始化技术详解
C语言中的二维数组:定义与初始化技术详解
71 0
|
2月前
|
存储 编译器 C语言
C语言指针变量的定义与初始化技术详解
C语言指针变量的定义与初始化技术详解
28 0
|
2月前
|
存储 C语言 索引
C语言一维数组的定义与初始化技术详解
C语言一维数组的定义与初始化技术详解
43 0