链式栈的功能实现与链表完全相同
//自定义的头文件
#include <stdio.h>
#include <stdlib.h>
typedef int datatype;
typedef struct stack
{
datatype data;
struct stack * next;
}linkstack;
linkstack * Create_Linkstack(); //初始化
void Push_Linkstack(linkstack *s, datatype data); //入栈
datatype Pop_Linkstack(linkstack *s); //出栈
int is_empty_linkstack(linkstack *s); //判断是否为空
datatype Gettop_Linkstack(linkstack *s); //取栈顶元素
void Free_Linkstack(linkstack *s); //释放空间
void menu(void); //菜单
void Print_Linkstack(linkstack *s); //打印
//函数实现
#include "linkstack.h"
linkstack *Create_Linkstack()
{
linkstack *s;
if((s = (linkstack *)malloc(sizeof(linkstack))) == NULL)
{
printf("malloc failed!\n");
return NULL;
}
s->next = NULL;
return s;
}
int is_empty_linkstack(linkstack *s)
{
return (s->next == NULL ? 1 : 0);
}
void Push_Linkstack(linkstack *s, datatype data)
{
linkstack *p;
if((p = (linkstack *)malloc(sizeof(linkstack))) == NULL)
{
printf("malloc failed!\n");
return ;
}
p->data = data;
p->next = s->next;
s->next = p;
return ;
}
datatype Pop_Linkstack(linkstack *s)
{
datatype ret;
linkstack *p;
if(s->next == NULL)
{
printf("linkstack empty!\n");
exit(-1);
}
p = s->next;
ret = p->data;
s->next = p->next;
free(p);
p = NULL;
return ret;
}
void Free_Linkstack(linkstack *s)
{
linkstack *p;
p = s->next;
while(p != NULL)
{
s->next = p->next;
free(p);
p = s->next;
}
puts("");
}
void Print_Linkstack(linkstack *s)
{
s = s->next;
while(s != NULL)
{
printf("%d\t",s->data);
s = s->next;
}
puts("");
}
void menu(void)
{
printf("-1->quit\n");
printf("0->menu\n");
printf("1->push\n");
printf("2->free\n");
printf("3->pop\n");
printf("4->gettop\n");
printf("5->is_empty_linkstack\n");
printf("6->print\n");
}
datatype Gettop_Linkstack(linkstack *s)
{
datatype ret;
if(s->next == NULL)
{
printf("linkstack empty!\n");
exit(-1);
}
ret = s->next->data;
return ret;
}
//测试函数
#include "linkstack.h"
int main(int argc, char *argv[])
{
int choice;
linkstack *s;
datatype value;
int len;
menu();
s = Create_Linkstack();
while(1)
{
printf("please input function choice:\n");
scanf("%d",&choice);
switch(choice)
{
case -1:
exit(1);
case 0:
menu();
break;
case 1:
while(1)
{
printf("please input the data(-1 to quit):\n");
scanf("%d",&value);
if(value == -1)
{
break;
}
Push_Linkstack(s,value);
}
break;
case 2:
Free_Linkstack(s);
break;
case 3:
value = Pop_Linkstack(s);
printf("the pop data is %d\n",value);
break;
case 4:
value = Gettop_Linkstack(s);
printf("the top data is %d\n",value);
break;
case 5:
if((len = is_empty_linkstack(s)) == 1)
printf("sqstack empty!\n");
else
printf("sqstack not empty!\n");
break;
case 6:
Print_Linkstack(s);
break;
}
}
free(s);
return 0;
}