CSDN博客

img hongweijin

链表堆栈的基本函数

发表于2004/10/13 14:13:00  1203人阅读

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

 

阅读全文
0 0

相关文章推荐

img
取 消
img