堆栈(Strack)是指这样一段内存,它可以理解为一个筒结构,先放进筒中的数据被后放进筒中的数据“压住”,只有后放进筒中的数据都取出后,先放进去的数据才能被取出,称为“后进先出”。堆栈的长度可随意增加。堆栈结构可用链表实现。设计一个链表结构需包含两个成员:一个存放数据,一个为指向下一个节点的指针。当每次有一个新数据要放入堆栈时,称为“压入堆栈”,这时动态建立一个链表的节点,并连接到链表的结尾;当每次从堆栈中取出一个数据时,称为“弹出堆栈”,这意味着从链表的最后一个节点中取出该节点的数据成员,同时删除该节点,释放该节点所占的内存。 编程用链表方法实现堆栈数据结构。程序至少应该包含三个函数: 1、主函数 2、压栈操作:将5个数据依次压入堆栈 3、出栈操作:将5个数据依次弹出堆栈(注意:因为后进先出的原因,弹出时是逆序,另外,弹出后要删除该节点内存); **输入提示:printf("请输入要压栈的整数:"); **输入格式:"%d" **压栈后输出格示:"Push %dth Data:%d\n" **出栈后输出格式:"Pop %dth Data:%d\n"
#include<stdio.h>
#include<stdlib.h>
#define N 5
typedef struct Astract{
int data;
struct Astract* next;
}Tong;
Tong* intong(Tong* head)
{
Tong* tail = head;
for(int i=0; i<N; i++)
{
Tong* s = (Tong*)malloc(sizeof(Tong));
printf("请输入要压栈的整数:");
scanf("%d",&s->data);
printf("Push %dth Data:%d\n",i+1,s->data);
s->next = NULL;
tail->next = s;
tail = s;
}
return tail;
}
void outtong(Tong* head, Tong* tail)
{
for(int i=0; i<N; i++)
{
Tong* front = head;
while(front->next != tail)
{
front = front->next;
}
printf("Pop %dth Data:%d\n",N-i,front->next->data);
front->next = NULL;
free(tail);
tail = front;
}
}
int main()
{
Tong* head = (Tong*)malloc(sizeof(Tong));
head->next = NULL;
Tong* tail = intong(head);
outtong(head, tail);
return 0;
}
注释:在函数内部创建链表最后需要返回指针,否则无法在函数块外使用,因为结点链接在一起,故返回一个指针即可获取整个链表。