要求编写功能函数实现堆栈的定义,基于链栈:按用户要求输入元素,编写进栈函数push();编写出栈函数pop();编写判断栈满和栈空的函数 ;遍历栈,并输出元素;输入数据实现十进制到二进制的转换。c语言实现完整代码,并给出算法流程
时间: 2024-05-22 15:16:07 浏览: 53
算法流程:
1. 定义链栈的结构体StackNode和Stack,其中StackNode包含数据元素和指向下一个节点的指针,Stack包含链栈的栈顶指针top。
2. 实现进栈函数push(),将新元素插入到栈顶。
3. 实现出栈函数pop(),将栈顶元素弹出,并返回其值。
4. 实现判断栈满和栈空的函数,根据链栈的特点,链栈不会满,只需判断栈是否为空。
5. 实现遍历栈函数,从栈顶开始,依次输出元素。
6. 实现十进制到二进制的转换函数,利用栈的特点,将十进制数不断除以2,每次将余数进栈,最后依次出栈得到二进制数。
完整代码:
#include <stdio.h>
#include <stdlib.h>
#define ERROR -1
// 链栈的结构体
typedef struct StackNode {
int data; // 数据元素
struct StackNode *next; // 指向下一个节点的指针
} StackNode, *Stack;
// 进栈函数push()
void push(Stack *top, int data) {
StackNode *new_node = (StackNode *)malloc(sizeof(StackNode)); // 创建新节点
new_node->data = data; // 赋值
new_node->next = *top; // 新节点指向原来的栈顶
*top = new_node; // 栈顶指向新节点
}
// 出栈函数pop()
int pop(Stack *top) {
if (*top == NULL) { // 栈空
return ERROR;
}
StackNode *p = *top; // 保存栈顶
int data = p->data; // 取出栈顶元素
*top = (*top)->next; // 栈顶指向下一个节点
free(p); // 释放原来的栈顶
return data;
}
// 判断栈空函数
int is_empty(Stack top) {
return top == NULL;
}
// 遍历栈函数
void traverse(Stack top) {
if (top == NULL) { // 栈空
printf("Stack is empty.\n");
return;
}
printf("Stack:\n");
StackNode *p = top;
while (p != NULL) { // 遍历栈
printf("%d\n", p->data);
p = p->next;
}
}
// 十进制到二进制转换函数
void decimal_to_binary(Stack *top, int decimal) {
while (decimal != 0) { // 除以2,余数进栈
int remainder = decimal % 2;
push(top, remainder);
decimal /= 2;
}
printf("Binary: ");
while (!is_empty(*top)) { // 依次出栈
printf("%d", pop(top));
}
printf("\n");
}
int main() {
Stack top = NULL; // 栈顶指针初始化
int choice, data, decimal;
while (1) {
printf("1. Push\n");
printf("2. Pop\n");
printf("3. Traverse\n");
printf("4. Decimal to binary\n");
printf("5. Exit\n");
printf("Enter your choice: ");
scanf("%d", &choice);
switch (choice) {
case 1:
printf("Enter data to push: ");
scanf("%d", &data);
push(&top, data);
break;
case 2:
data = pop(&top);
if (data == ERROR) {
printf("Stack is empty.\n");
} else {
printf("Pop data: %d\n", data);
}
break;
case 3:
traverse(top);
break;
case 4:
printf("Enter decimal number: ");
scanf("%d", &decimal);
decimal_to_binary(&top, decimal);
break;
case 5:
exit(0);
default:
printf("Invalid choice.\n");
}
}
return 0;
}
阅读全文