[size=large]栈的链表实现[/size]
记得以前大二学数据结构时利用C++数组实现过栈。这几天还是在看数据结构和算法方面的书,期望提高一下自己的内功。然后看到了很多关于栈的实现,其中要求利用链表实现很多。当时觉得这个应该很简单,所以直接就看了答案,看是否和自己的思路一样。当然,思路是一样了。但是发现所有的栈链表实现都是定义了一个全局变量来表示栈顶,然后这个栈的功能就是修改这个变量。
那么就有个问题了,这就代表这个栈结构每次只能实例化一个栈来用,不能用作两个,那如果某个应用需要利用两个栈,这就不好处理了,所以本人就想自己实现一个满足这个需求的栈。另外也是向学一下gdb调试。所以选简单点的实现。
废话不多说了,贴上代码:
记得以前大二学数据结构时利用C++数组实现过栈。这几天还是在看数据结构和算法方面的书,期望提高一下自己的内功。然后看到了很多关于栈的实现,其中要求利用链表实现很多。当时觉得这个应该很简单,所以直接就看了答案,看是否和自己的思路一样。当然,思路是一样了。但是发现所有的栈链表实现都是定义了一个全局变量来表示栈顶,然后这个栈的功能就是修改这个变量。
那么就有个问题了,这就代表这个栈结构每次只能实例化一个栈来用,不能用作两个,那如果某个应用需要利用两个栈,这就不好处理了,所以本人就想自己实现一个满足这个需求的栈。另外也是向学一下gdb调试。所以选简单点的实现。
废话不多说了,贴上代码:
/**********************************************
* copyright (c) 383569614@qq.com
* 2012-07 at Hunan University
* description: stack.h file
* the function's and node declaration
***********************************************/
#ifndef _STACK_H
#define _STACK_H
typedef struct DATA
{
int index;
}data;
typedef struct NODE
{
data d;
struct NODE *next;
}node;
typedef struct STACK
{
node *head;
int size;
}stack;
stack* init(stack* st); //init a stack
void push(stack* st,data d);//push d into stack
void pop(stack *st); //pop a elem from stack
data gettop(stack* st); //get the value of top of stack
int getsize(stack* st); //get the size of stack
void destroy(stack *st); //destroy a stack
int isempty(stack *st); //whether stack is empty
#endif
/*******************************************
* copyright (c) 383569614@qq.com
* 2012-07 at Hunan University
* description: stack.c
* implementations of my stack's interfaces
*******************************************/
#include <stdio.h>
#include <stdlib.h>
#include "stack.h"
stack* init(stack* st)
{
st=(stack*)malloc(sizeof(stack));
st->head=NULL;
st->size=0;
return st;
}
void push(stack* st,data d)
{
node *p=(node*)malloc(sizeof(node));
p->d=d;
if(st->head==NULL)
{
st->head=p;
st->head->next=NULL;
}
else
{
p->next=st->head;
st->head=p;
}
st->size++;
}
void pop(stack* st)
{
if(st->head!=NULL)
{
node *p=st->head;
st->head=p->next;
st->size--;
free(p);
}
else
{
printf("stack is empty!\n");
}
}
data gettop(stack* st)
{
return st->head->d;
}
int getsize(stack* st)
{
return st->size;
}
void destroy(stack* st)
{
while(st->head)
{
node *p=st->head;
st->head=p->next;
free(p);
}
}
int isempty(stack* st)
{
return st->head==NULL;
}
/************************************
* copyright (c) 383569614@qq.com
* 2012-07 at Hunan University
* description: main.c
* test the function of my stack
**************************************/
#include <stdio.h>
#include "stack.h"
int main()
{
stack *st=NULL;
st=init(st);
int x=0;
data d;
for( x=0 ; x<10 ; x++ )
{
d.index=x;
push(st,d);
}
while(!isempty(st))
{
printf("%d ",gettop(st).index);
pop(st);
}
printf("\n");
destroy(st);
return 0;
}