C语言栈的实现

栈是常用的数据结构之一,下面给出一个链式栈的实现~~
头文件Stack.h

#ifndef Stack_H
#define Stack_H

typedef int Item;
typedef struct node * PNode;
/*定义栈节点类型*/
typedef struct node
{
    Item data;
    PNode down;
}Node;
/*定义栈类型*/
typedef struct stack
{
    PNode top;
    int size;
}Stack;
/*构造一个空栈*/
Stack *InitStack();

/*销毁一个栈*/
void DestroyStack(Stack *ps);

/*把栈置空*/
void ClearStack(Stack *ps);

/*判定是否为空栈*/
int IsEmpty(Stack *ps);

/*返回栈大小*/
int GetSize(Stack *ps);

/*返回栈顶元素*/
PNode GetTop(Stack *ps,Item *pitem);

/*元素入栈*/
PNode Push(Stack *ps,Item item);

/*元素出栈*/
PNode Pop(Stack *ps,Item *pitem);

/*遍历栈并访问visit函数*/
void StackTraverse(Stack *ps,void (*visit)());

#endif

实现部分Stack.c:

 1 #include"Stack.h"
 2 #include<malloc.h>
 3 #include<stdlib.h>
 4 /*构造一个空栈*/
 5 Stack *InitStack()
 6 {
 7     Stack *ps = (Stack *)malloc(sizeof(Stack));
 8     if(ps!=NULL)
 9     {
10         ps->top = NULL;
11         ps->size = 0;
12     }
13     return ps;
14 }
15 
16 /*判定是否为空栈*/
17 int IsEmpty(Stack *ps)
18 {
19     if(ps->top == NULL && ps->size == 0)
20         return 1;
21     else
22         return 0;
23 }
24 
25 /*返回栈大小*/
26 int GetSize(Stack *ps)
27 {
28     return ps->size;
29 }
30 
31 /*元素入栈*/
32 PNode Push(Stack *ps,Item item)
33 {
34     PNode pnode = (PNode)malloc(sizeof(Node));
35     if(pnode != NULL)
36     {
37         pnode->data = item;
38         pnode->down = GetTop(ps,NULL);
39         ps->size++;
40         ps->top = pnode;
41         
42     }
43     return pnode;
44 }
45 
46 /*返回栈顶元素*/
47 PNode GetTop(Stack *ps,Item *pitem)
48 {
49     if(IsEmpty(ps)!=1&&pitem!=NULL)
50     {
51         *pitem = ps->top->data;
52     }
53     return ps->top;
54 }
55 
56 
57 /*元素出栈*/
58 PNode Pop(Stack *ps,Item *pitem)
59 {
60     PNode p = ps->top;
61     if(IsEmpty(ps)!=1&&p!=NULL)
62     {
63         if(pitem!=NULL)
64             *pitem = p->data;
65         ps->size--;
66         ps->top = ps->top->down;    
67         free(p);
68     }
69     return ps->top;
70 }
71 
72 /*销毁一个栈*/
73 void DestroyStack(Stack *ps)
74 {
75     if(IsEmpty(ps)!=1)
76         ClearStack(ps);
77     free(ps);
78 }
79 
80 /*把栈置空*/
81 void ClearStack(Stack *ps)
82 {
83     while(IsEmpty(ps)!=1)
84     {
85         Pop(ps,NULL);
86     }
87 }
88 
89 /*遍历栈并访问visit函数 */
90 void StackTraverse(Stack *ps,void (*visit)())
91 {
92     PNode p = ps->top;
93     int i = ps->size;
94     while(i--)
95     {
96         visit(p->data);
97         p = p->down;
98     }
99 }

测试部分Test.c:

 1 #include"Stack.h"
 2 #include<stdio.h>
 3 void print(Item i)
 4 {
 5     printf("该节点元素为%d\n",i);
 6 }
 7 main()
 8 {
 9     Stack *ps = InitStack();
10     int i,item;
11 
12     printf("0-9依次入栈并输出如下:\n");
13     for(i=0;i<10;i++)
14     {
15         Push(ps,i);
16         GetTop(ps,&item);
17         printf("%d ",item);
18     }
19     
20     printf("\n从栈顶到栈顶遍历并对每个元素执行print函数:\n");
21     StackTraverse(ps,print);
22 
23     printf("栈中元素依次出栈并输出如下:\n");
24     for(i=0;i<10;i++)
25     {
26         Pop(ps,&item);
27         printf("%d ",item);
28     }
29     
30     ClearStack(ps);
31     if(IsEmpty(ps))
32         printf("\n将栈置空成功\n");
33     DestroyStack(ps);
34     printf("栈已被销毁\n");
35         
36 }

 

 

posted @ 2013-11-06 23:16  stemon  阅读(568)  评论(0编辑  收藏  举报