链表堆栈的基本函数

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

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值