堆栈(Strack)是指这样一段内存,它可以理解为一个筒结构,先放进筒中的数据被后放进筒中的数据“压住”,只有后放进筒中的数据都取出后,先放进去的数据才能被取出,称为“后进先出”。堆栈的长度可随意增加。堆栈结构可用链表实现。设计一个链表结构需包含两个成员:一个存放数据,一个为指向下一个节点的指针。当每次有一个新数据要放入堆栈时,称为“压入堆栈”,这时动态建立一个链表的节点,并连接到链表的结尾;当每次从堆栈中取出一个数据时,称为“弹出堆栈”,这意味着从链表的最后一个节点中取出该节点的数据成员,同时删除该节点,释放该节点所占的内存。 编程用链表方法实现堆栈数据结构。程序至少应该包含三个函数: 1、主函数 2、压栈操作:将5个数据依次压入堆栈 3、出栈操作:将5个数据依次弹出堆栈(注意:因为后进先出的原因,弹出时是逆序,另外,弹出后要删除该节点内存); **输入提示:printf("请输入要压栈的整数:"); **输入格式:"%d" **压栈后输出格示:"Push %dth Data:%d\n" **出栈后输出格式:"Pop %dth Data:%d\n"
时间: 2023-07-16 18:11:27 浏览: 56
以下是用链表实现堆栈的代码:
```c
#include <stdio.h>
#include <stdlib.h>
// 定义链表节点结构体
struct Node {
int data;
struct Node *next;
};
// 压栈函数
void push(struct Node **head, int data) {
// 创建新节点
struct Node *new_node = (struct Node*) malloc(sizeof(struct Node));
new_node->data = data;
new_node->next = NULL;
// 如果堆栈为空,则将新节点作为堆栈头节点
if (*head == NULL) {
*head = new_node;
printf("Push 1st Data:%d\n", data);
return;
}
// 否则将新节点插入到堆栈头部
new_node->next = *head;
*head = new_node;
printf("Push %dth Data:%d\n", (*head)->data, data);
}
// 出栈函数
void pop(struct Node **head) {
// 如果堆栈为空,则直接返回
if (*head == NULL) {
return;
}
// 否则弹出堆栈顶部节点
struct Node *temp = *head;
printf("Pop %dth Data:%d\n", (*head)->data, temp->data);
*head = (*head)->next;
free(temp);
}
int main() {
struct Node *head = NULL;
// 压入5个数据
for (int i = 1; i <= 5; i++) {
int data;
printf("请输入要压栈的整数:");
scanf("%d", &data);
push(&head, data);
}
// 弹出5个数据
for (int i = 1; i <= 5; i++) {
pop(&head);
}
return 0;
}
```
在上面的代码中,我们使用了链表来实现堆栈数据结构。在 `push` 函数中,我们首先创建一个新节点,并将它插入到链表头部,同时打印出“Push”语句以及数据的编号和值。在 `pop` 函数中,我们首先判断链表是否为空,如果不为空,则弹出链表头部节点,并释放该节点所占的内存,同时打印出“Pop”语句以及数据的编号和值。最后在主函数中,我们先压入5个数据,然后再弹出这5个数据。