linkstack.h //链式栈头文件
#ifndef __LINKLIST_H__
#define __LINKLIST_H__
#include <stdio.h>
#include <stdlib.h>
typedef int datatype; /*定义栈中数据元素数据类型*/
typedef struct node{ //栈节点的定义,同单链表定义相同
datatype data; /*存储的数据*/
struct node* next; /*链接指针域*/
}listnode,*linklist; /*链栈类型定义*/
extern linklist stack_create(); //创建栈
extern int stack_empty(linklist s); //判断栈是否为空(1表示空,0表示非空)
extern void stack_clear(linklist s); //清空栈
extern int stack_push(linklist s,datatype value); //入栈
extern datatype stack_pop(linklist s); //出栈
extern datatype stack_top(linklist s); //获取栈顶的数据
extern void stack_free(linklist s); //释放栈
#endif
linkstack.c //链式栈中相关函数的实现方法
#include "linkstack.h"
linklist stack_create() //创建栈
{
linklist s;
if((s=(linklist)malloc(sizeof(listnode)))==NULL){
puts("malloc failed");
return NULL;
}
s->next=NULL;
return s;
}
int stack_empty(linklist s) //判断栈是否为空(1表示空,0表示非空)
{
return (s->next==NULL ? 1:0);
}
int stack_push(linklist s,datatype value) //入栈
{
linklist p;
if((p=(linklist)malloc(sizeof(listnode)))==NULL)
{
puts("malloc failed");
return -1;
}
p->data = value;
p->next=s->next;
s->next = p;
return 0;
}
datatype stack_pop(linklist s) //出栈(应用程序中应该先调用 "int stack_empty(linklist s);" 函数,判断栈不为空时才能出栈)
{
linklist p;
datatype ret;
p=s->next;
s->next=p->next;
ret=p->data;
free(p);
p=NULL;
return ret;
}
datatype stack_top(linklist s) //获取栈顶的数据
{
return (s->next->data);
}
void stack_clear(linklist s) //清空栈
{
linklist p;
printf("clear:");
p=s->next;
while(p)
{
s->next=p->next;
printf("%d ",p->data);
free(p);
p=s->next;
}
putchar(10); //10 表示 回车符('\n')
}
void stack_free(linklist s) //释放栈
{
linklist p;
printf("free:");
p=s;
while(p)
{
s=s->next;
printf("%d ",p->data);
free(p);
p=s;
}
putchar(10); //10 表示 回车符('\n')
}