C语言实现栈(Stack)及进制转换
C语言实现栈(Stack)及进制转换
本文提供一个基于C语言顺序存储结构的栈(Stack)实现,包含以下功能:
- 初始化栈
- 入栈 (push)
- 出栈 (pop)
- 判断栈是否为空 (IsEmpty)
- 判断栈是否为满 (IsFull)
- 获取栈顶元素 (gettop)
此外,我们还将演示如何使用该栈实现十进制到二进制、八进制、十六进制的转换。
代码实现
#include <stdio.h>
#include <stdlib.h>
#define MAX_SIZE 100
typedef struct {
int* data;
int top;
} Stack;
// 初始化栈
void init(Stack* stack) {
stack->data = (int*)malloc(MAX_SIZE * sizeof(int));
stack->top = -1;
}
// 判断栈是否为空
int IsEmpty(Stack* stack) {
return stack->top == -1;
}
// 判断栈是否为满
int IsFull(Stack* stack) {
return stack->top == MAX_SIZE - 1;
}
// 入栈
void push(Stack* stack, int element) {
if (IsFull(stack)) {
printf('Stack is full. Cannot push element.\n');
return;
}
stack->top++;
stack->data[stack->top] = element;
}
// 出栈
int pop(Stack* stack) {
if (IsEmpty(stack)) {
printf('Stack is empty. Cannot pop element.\n');
return -1;
}
int element = stack->data[stack->top];
stack->top--;
return element;
}
// 获取栈顶元素
int gettop(Stack* stack) {
if (IsEmpty(stack)) {
printf('Stack is empty. There is no top element.\n');
return -1;
}
return stack->data[stack->top];
}
// 十进制转换为其他进制(二进制、十六进制、八进制)
void convert(Stack* stack, int number, int base) {
while (number > 0) {
int remainder = number % base;
push(stack, remainder);
number /= base;
}
}
// 输出栈中的元素
void display(Stack* stack) {
while (!IsEmpty(stack)) {
printf('%d ', pop(stack));
}
printf('\n');
}
int main() {
Stack stack;
init(&stack);
int number, base;
printf('Enter a decimal number: ');
scanf('%d', &number);
printf('Enter the base for conversion (2, 8, 16): ');
scanf('%d', &base);
convert(&stack, number, base);
printf('The converted number is: ');
display(&stack);
free(stack.data);
return 0;
}
代码说明
Stack结构体定义了栈的数据结构,包含一个data指针用于存储栈元素,top表示栈顶位置。init()函数初始化栈,分配内存并设置栈顶指针为 -1。IsEmpty()和IsFull()函数分别用于判断栈是否为空或栈满。push()函数将元素压入栈顶。pop()函数将栈顶元素弹出并返回该元素。gettop()函数返回栈顶元素,但不改变栈结构。convert()函数将十进制数转换为指定进制,并将每一位余数依次压入栈中。display()函数将栈中元素依次弹出并打印,实现进制转换结果的输出。
总结
本文介绍了使用C语言顺序存储结构实现栈的方法,并通过进制转换的例子展示了栈的应用。你可以根据实际需求对代码进行扩展和优化,例如:
- 增加错误处理机制,例如栈溢出和栈下溢的处理
- 支持更多进制的转换
- 使用更复杂的数据类型作为栈元素
原文地址: https://www.cveoy.top/t/topic/bzU7 著作权归作者所有。请勿转载和采集!