链表堆栈的基本函数

原创 2004年10月13日 14:13:00

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

 

链表的基本操作函数算法(C/C++实现)

链表的基本操作函数,一般的数据结构的书籍中涉及到的链表的基本操作算法都实现了 #include #include #include using namespace std; typedef...
  • lovemylife1234
  • lovemylife1234
  • 2017年02月09日 23:32
  • 331

单向链表实现堆栈

单向链表实现堆栈 要求: 1 使用C语言; 2 使用单向链表; 3 接口规范,通用性强; 解: 1 链表元素的类型确定 为了最终确定这两个函数的调用模型,你还需要知道进出堆栈的数据是属于哪种类型的。也...
  • chendesheng1988
  • chendesheng1988
  • 2014年01月18日 18:45
  • 1423

链表堆栈C实现

链表堆栈的C实现
  • qq_29183809
  • qq_29183809
  • 2015年11月24日 19:24
  • 452

链表,队列,堆栈的区别

链表,队列,堆栈的区别 1、栈是个有底的口袋,像袜子。 队列是没底的口袋,像通心粉。 所以:栈的特点是先进后出,队列的特点是先进先出。 2、主要区别是适用的地方不一样,      链表实际上...
  • jixinhuluwa
  • jixinhuluwa
  • 2016年01月06日 17:18
  • 1360

数组、链表、堆栈和队列、线性表和顺序表

转自http://blog.csdn.net/amork/article/details/7258216 数据结构:是指相互之间存在一种或多种特定关系的数据元素的集合。听起来是不是很抽象,简单理解:...
  • qingkongyeyue
  • qingkongyeyue
  • 2016年12月26日 13:51
  • 1065

数组、链表、堆栈、队列和树

数据结构:是指相互之间存在一种或多种特定关系的数据元素的集合。听起来是不是很抽象,简单理解:数据结构就是描述对象间逻辑关系的学科。比如:队列就是一种先进先出的逻辑结构,栈是一种先进后出的逻辑结构,家谱...
  • wei78008023
  • wei78008023
  • 2016年02月25日 10:04
  • 2955

java用链表实现堆栈和队列

链表是基本的数据结构,在C语言中的基本结构如下:         struct  List {                  int data;//数据                  s...
  • zzobin
  • zzobin
  • 2011年12月13日 22:43
  • 4418

51 建立链表

请按照输入整数的顺序建立一个倒序的带表头节点的链表。已知程序的基本结构如下,请你编写 ins_list 函数。 预设代码: /* PRESET CODE BEGIN - NEVER TOU...
  • java_student09
  • java_student09
  • 2013年01月10日 12:07
  • 676

c++利用链表写一个简单的栈

c++中其实有stack的模板类。功能更为强大。 自己写一个栈能让我们对栈这种数据结构更加熟悉。这个栈有一个不足之处就是里面存放的元素类型只能为int。#include using namespa...
  • huplion
  • huplion
  • 2015年11月16日 19:47
  • 1383

【每日算法】链表 & 例题选讲

单链表 链表是常用的数据结构,其优点是插入和删除元素时不需要移动,表的容量可扩充,且存储空间可以不连续。 另外,由于涉及到指针,所以很受面试官的青睐。 本文将主要介绍单链表,并简单介绍下双链表和...
  • jiange_zh
  • jiange_zh
  • 2016年02月24日 14:55
  • 1453
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:链表堆栈的基本函数
举报原因:
原因补充:

(最多只允许输入30个字)