要求编写功能函数实现堆栈的定义,基于链栈:按用户要求输入元素,编写进栈函数push();编写出栈函数pop();编写判断栈满和栈空的函数 ;遍历栈,并输出元素;输入数据实现十进制到二进制的转换。c语言实现完整代码,并给出算法流程
时间: 2024-05-02 19:21:32 浏览: 12
算法流程:
1. 定义链栈结构体,包含元素数据和指向下一个结点的指针。
2. 定义栈顶指针。
3. 实现进栈函数 push(),将新元素插入栈顶,并更新栈顶指针。
4. 实现出栈函数 pop(),将栈顶元素弹出,并更新栈顶指针。
5. 实现判断栈满和栈空的函数 isFull() 和 isEmpty(),根据链栈的特性,链栈不会满,因此只需要判断栈顶指针是否为 NULL 即可。
6. 实现遍历栈函数 traverse(),从栈顶开始遍历链表,并输出每个元素的值。
7. 实现十进制到二进制的转换函数 decToBin(),使用进栈操作将每个二进制位的值存入栈中,然后依次出栈输出即可。
完整代码:
```c
#include <stdio.h>
#include <stdlib.h>
// 定义链栈结构体
typedef struct node {
int data;
struct node *next;
} Node, *NodePtr;
// 定义栈顶指针
NodePtr top = NULL;
// 进栈函数
void push(int data) {
NodePtr newNode = (NodePtr)malloc(sizeof(Node));
newNode->data = data;
newNode->next = top;
top = newNode;
}
// 出栈函数
int pop() {
if (top == NULL) {
printf("栈已空!");
return -1;
}
int data = top->data;
NodePtr temp = top;
top = top->next;
free(temp);
return data;
}
// 判断栈满函数
int isFull() {
return 0; // 链栈不会满
}
// 判断栈空函数
int isEmpty() {
return top == NULL;
}
// 遍历栈函数
void traverse() {
NodePtr p = top;
while (p != NULL) {
printf("%d ", p->data);
p = p->next;
}
}
// 十进制到二进制的转换函数
void decToBin(int num) {
while (num > 0) {
int remainder = num % 2;
push(remainder);
num /= 2;
}
while (!isEmpty()) {
printf("%d", pop());
}
}
int main() {
// 测试进栈和遍历栈函数
push(1);
push(2);
push(3);
traverse(); // 输出:3 2 1
// 测试出栈函数
int data = pop();
printf("\n出栈元素:%d", data); // 输出:出栈元素:3
// 测试判断栈空函数
printf("栈是否为空:%d", isEmpty()); // 输出:栈是否为空:0
// 测试十进制到二进制的转换函数
printf("\n二进制数:");
decToBin(10); // 输出:二进制数:1010
return 0;
}
```