/***********************************************************************
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;
}