链表堆栈的基本函数

/***********************************************************************
REVISION LOG ENTRY
Revision By: http://blog.csdn.net/hongweijin
Revised on : 2004-10-12 21:33:31
Comments : 用链表堆栈实现表达式的计算
***********************************************************************/

#include <stdio.h>
#include <stdlib.h>

#defineElementTypeint
#define Statusint

#define NULL0
#define TRUE1
#define FALSE0

typedef struct StackNode *PtrToNode;

struct StackNode
{
ElementTypeElement;
PtrToNodenext;
};

PtrToNodeInitStack();
StatusDestroyStack( PtrToNode );
StatusStackEmpty( PtrToNode );
intStackLength( PtrToNode );
StatusGetTop( PtrToNode, ElementType& );
StatusPush( PtrToNode, ElementType );
StatusPop( PtrToNode, ElementType& );

///////////////////////////////////////////////////////////////////////
//
// 函数名 : main
// 功能描述 : main函数里面执行具体的功能函数
// 参数 : void
// 返回值 : void
//
///////////////////////////////////////////////////////////////////////
voidmain( void )
{
PtrToNodetop;
top = InitStack();

ElementTypeElement;
while (1)
{
scanf("%d", &Element);

if (Element < 0)
break;
if( !Push(top, Element) )
{
printf("\n压栈发生错误!\n");
return;
}
}

printf("\nThe stack length is:%d\n", StackLength( top ));

GetTop( top, Element );

printf("\nThe top number is:%d\n", Element );

printf("\nStack is Empty?:%d\n", StackEmpty( top ));

while(1)
{
if(!Pop(top, Element))
break;
printf(" %d ", Element);
}

DestroyStack(top);

printf("\nStack is Empty?:%d\n", StackEmpty( top ));

}


///////////////////////////////////////////////////////////////////////
//
// 函数名 : InitStack
// 功能描述 : 构造一个空的链表堆栈
// 参数 : PtrToNode &stack
// 返回值 : PtrToNode
//
///////////////////////////////////////////////////////////////////////
PtrToNodeInitStack()
{
PtrToNode stack;
/*分配一个空间用于头栈的初始化*/
stack = (PtrToNode)malloc(sizeof(StackNode));

/*系统分配出错的提示信息,这是程序员的义务*/
if (stack == NULL)
{
printf("\n系统初始化失败!\n");
return FALSE;
}
/*初始化栈顶元素的next域*/
stack->next = NULL;
stack->Element = NULL;

returnstack;
}


///////////////////////////////////////////////////////////////////////
//
// 函数名 : DestroyStack
// 功能描述 : 把一个存在的堆栈销毁
// 参数 : PtrToNode & stack
// 返回值 : Status
//
///////////////////////////////////////////////////////////////////////
StatusDestroyStack(PtrToNode stack)
{
/*删除所用的辅助指针*/
PtrToNodeclient = NULL;

while (stack->next != NULL)
{
client = stack->next->next;
free(stack->next);
stack = client;
}

return TRUE;
}

///////////////////////////////////////////////////////////////////////
//
// 函数名 : StackEmpty
// 功能描述 : 判断一个堆栈是不是为空
// 参数 : PtrToNode stack
// 返回值 : Status
//
///////////////////////////////////////////////////////////////////////
StatusStackEmpty(PtrToNode stack)
{
if (stack->next == NULL)
return TRUE;

return FALSE;
}


///////////////////////////////////////////////////////////////////////
//
// 函数名 : StackLength
// 功能描述 : 得到堆栈的长度
// 参数 : PtrToNode stack
// 返回值 : int
//
///////////////////////////////////////////////////////////////////////
intStackLength(PtrToNode stack)
{
intclient = 0;

while (stack != NULL)
{
stack = stack->next;
client++;
}

return client - 1;/*头结点不能算进来*/
}

///////////////////////////////////////////////////////////////////////
//
// 函数名 : GetTop
// 功能描述 : 得到堆栈的栈顶元素用client返回
// 参数 : PtrToNode stack
// 参数 : ElementType& client
// 返回值 : Status
//
///////////////////////////////////////////////////////////////////////
StatusGetTop( PtrToNode stack, ElementType& client)
{
if (stack->next == NULL)
return FALSE;
/*头结点只是用于初始化,不放数据*/
client = stack->next->Element;

return client;
}


///////////////////////////////////////////////////////////////////////
//
// 函数名 : Push
// 功能描述 : 往栈中压入元素
// 参数 : PtrToNode stack
// 参数 : ElementType client
// 返回值 : Status
//
///////////////////////////////////////////////////////////////////////
StatusPush(PtrToNode stack, ElementType client )
{
PtrToNode temp = NULL;

temp = (PtrToNode)malloc(sizeof(StackNode));
if (temp == NULL)
{
printf("\n系统初始化失败!\n");
return FALSE;
}
temp->next = stack->next;
stack->next = temp;

temp->Element = client;

return TRUE;
}


///////////////////////////////////////////////////////////////////////
//
// 函数名 : Pop
// 功能描述 : 从一个不为空的栈中弹出一个元素
// 参数 : PtrToNode stack
// 参数 : ElementType& client
// 返回值 : void
//
///////////////////////////////////////////////////////////////////////

StatusPop(PtrToNode stack, ElementType &client)
{
PtrToNodetempNext = NULL;
if (stack->next == NULL)
return FALSE;
tempNext = stack->next;
stack->next = stack->next->next;
client = tempNext->Element;
free(tempNext);

return TRUE;
}

你可能感兴趣的:(.net,Blog)