Stack.h:結構定義和函數申明
#ifndef __STACK_H__
#define __STACK_H__
//一些庫函數的頭文件包含
#include <string.h>
#include <ctype.h>
#include <malloc.h>
#include <limits.h>
#include <stdio.h>
#include <stdlib.h>
#include <io.h>
#include <math.h>
//自定義bool
typedef int Boolean;
//定義函數返回狀態
typedef int Status;
#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
typedef struct Node
{
int data;
struct Node *next;
}LNode,*PNode;
typedef struct stack
{
LinkList base; //棧基址 ,棧底
LinkList top; // 棧頂
int len;
}STACK,*PSTACK;
/* 初始化 */
Status init(PSTACK ps);
/* 銷燬 */
Status destroy(PSTACK ps);
/* 重置 */
Status clear(PSTACK ps);
/* 判空 */
Boolean isEmpty(STACK s);
/* 獲取已存元素的數量 */
int listLen(STACK s);
/* 獲取棧頂元素 */
Status getTop(STACK s,int *elem);
/* 入棧元素 */
Status push(PSTACK ps, int elem);
/* 出棧元素 */
int pop(PSTACK ps, int* elem);
/* 瀏覽棧中值 */
Status traverse(STACK s, void (*vi)(int));
#endif
Stack.c :基本函數實現
#include "Stack.h"
/* 初始化 */
Status init(PSTACK ps)
{
ps->base = (PNode)malloc(sizeof(LNode));
if(!ps->base)
{
printf("動態內存分配失敗");
exit(-1);
}
ps->base->next=NULL;
ps->top = ps->base;
ps->len = 0;
return OK;
}
/* 重置 */
Status clear(PSTACK ps)
{
PNode p,q;
if(ps->top != ps->base) //不是空棧
{
p = ps->top->next;
ps->top->next = NULL;//將頭結點和第一個結點斷開
while(p)
{
q = p->next;
free(p);
p = q;
}
ps->base = ps->top;
ps->len = 0;
}
return OK;
}
/* 銷燬 */
Status destroy(PSTACK ps)
{
clear(ps);
free(ps->top);
ps->top = NULL;
ps->base = NULL;
ps->len = 0;
return OK;
}
/* 判空 */
Boolean isEmpty(STACK s)
{
if(s.base == s.top)
{
return TRUE;
}
else
{
return FALSE;
}
}
/* 獲取已存元素的數量 */
int listLen(STACK s)
{
return s.len;
}
/* 獲取棧頂元素 */
Status getTop(STACK s,int *elem)
{
PNode p;
if(!isEmpty(s))
{
p = s.top->next;
*elem = p->data;
return OK;
}
else
{
return ERROR;
}
}
/* 入棧元素 */
Status push(PSTACK ps, int elem)
{
PNode p = ps->top;
PNode newNode = (PNode)malloc(sizeof(LNode));
newNode->data = elem;
newNode->next = p->next;
p->next = newNode;
if(ps->top == ps->base)
{
ps->base = newNode;
}
ps->len++;
return OK;
}
/* 出棧元素 */
int pop(PSTACK ps, int *elem)
{
PNode q,p = ps->top; //頭結點
if(p->next)
{
q = p->next; //首結點
*elem = q->data;
p->next = q->next;
free(q);
if(p->next ==NULL)
{
ps->base = ps->top;
}
q = NULL;
return OK;
}
else
{
return ERROR;
}
}
/* 瀏覽棧中值 */
Status traverse(STACK s, void (*vi)(int))
{
PNode p = s.top->next;
while(p)
{
vi(p->data);
p = p->next;
}
return OK;
}