/***********************************************************************
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>
#define ElementType int
#define Status int
#define NULL 0
#define TRUE 1
#define FALSE 0
typedef struct StackNode *PtrToNode;
struct StackNode
{
ElementType Element;
PtrToNode next;
};
PtrToNode InitStack();
Status DestroyStack( PtrToNode );
Status StackEmpty( PtrToNode );
int StackLength( PtrToNode );
Status GetTop( PtrToNode, ElementType& );
Status Push( PtrToNode, ElementType );
Status Pop( PtrToNode, ElementType& );
///
//
// 函数名 : main
// 功能描述 : main函数里面执行具体的功能函数
// 参数 : void
// 返回值 : void
//
///
void main( void )
{
PtrToNode top;
top = InitStack();
ElementType Element;
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
//
///
PtrToNode InitStack()
{
PtrToNode stack;
/*分配一个空间用于头栈的初始化*/
stack = (PtrToNode)malloc(sizeof(StackNode));
/*系统分配出错的提示信息,这是程序员的义务*/
if (stack == NULL)
{
printf("/n系统初始化失败!/n");
return FALSE;
}
/*初始化栈顶元素的next域*/
stack->next = NULL;
stack->Element = NULL;
return stack;
}
///
//
// 函数名 : DestroyStack
// 功能描述 : 把一个存在的堆栈销毁
// 参数 : PtrToNode & stack
// 返回值 : Status
//
///
Status DestroyStack(PtrToNode stack)
{
/*删除所用的辅助指针*/
PtrToNode client = NULL;
while (stack->next != NULL)
{
client = stack->next->next;
free(stack->next);
stack = client;
}
return TRUE;
}
///
//
// 函数名 : StackEmpty
// 功能描述 : 判断一个堆栈是不是为空
// 参数 : PtrToNode stack
// 返回值 : Status
//
///
Status StackEmpty(PtrToNode stack)
{
if (stack->next == NULL)
return TRUE;
return FALSE;
}
///
//
// 函数名 : StackLength
// 功能描述 : 得到堆栈的长度
// 参数 : PtrToNode stack
// 返回值 : int
//
///
int StackLength(PtrToNode stack)
{
int client = 0;
while (stack != NULL)
{
stack = stack->next;
client++;
}
return client - 1; /*头结点不能算进来*/
}
///
//
// 函数名 : GetTop
// 功能描述 : 得到堆栈的栈顶元素用client返回
// 参数 : PtrToNode stack
// 参数 : ElementType& client
// 返回值 : Status
//
///
Status GetTop( PtrToNode stack, ElementType& client)
{
if (stack->next == NULL)
return FALSE;
/*头结点只是用于初始化,不放数据*/
client = stack->next->Element;
return client;
}
///
//
// 函数名 : Push
// 功能描述 : 往栈中压入元素
// 参数 : PtrToNode stack
// 参数 : ElementType client
// 返回值 : Status
//
///
Status Push(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
//
///
Status Pop(PtrToNode stack, ElementType &client)
{
PtrToNode tempNext = NULL;
if (stack->next == NULL)
return FALSE;
tempNext = stack->next;
stack->next = stack->next->next;
client = tempNext->Element;
free(tempNext);
return TRUE;
}