[库]C实现的泛型栈

原创 2004年10月04日 22:02:00

/*
  Name:         stack.h
  Copyright:    1.0
  Author:       avalon
  Date: 02-10-04 19:48
  Description:  泛型设计的栈
*/
#ifndef AVALON_STACK_H
#define AVALON_STACK_H
#include <stdio.h>

#ifndef AVALON_BOOL
#define AVALON_BOOL
#define TRUE    1
#define FALSE   0
typedef int     BOOL;/*自定义的BOOL型*/
#endif

typedef struct Stack * StackHandle;/* 栈HANDLE */

/*******
  接口
*******/ 
StackHandle InitStack(size_t size);
/*构造一个空栈*/
BOOL GetTop(StackHandle S,void * elem);
/*若栈不空,则用elem返回S的栈顶元素,并返回TRUE*/
BOOL Push(StackHandle S,void * elem);
/*插入元素,elem为新的栈顶元素*/
BOOL Pop(StackHandle S, void * elem);
/*若栈不空,则删除S的栈顶元素,并用elem返回其值,
并返回TRUE.elem也可取NULL值,则仅做弹出动作*/
BOOL ClearStack(StackHandle S);
/*把S置为空栈*/
BOOL DestroyStack(StackHandle * S);
/*销毁栈S*/
BOOL StackEmpty(StackHandle S);
/*栈空?*/
int StackLength(StackHandle S);
/*栈长*/

#endif

 

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

/*
  Name:         stack.c
  Copyright:    1.0
  Author:       avalon
  Date: 02-10-04 19:48
  Description:  泛型设计的栈
*/
#include <stdio.h>
#include <assert.h>
#include <mem.h>

#ifndef AVALON_BOOL
#define AVALON_BOOL
#define   TRUE    1
#define   FALSE   0
typedef   int     BOOL;
#endif

/*******
数据结构
*******/
typedef struct Node{
    struct Node  * prior      ;/*前位置*/
    void         * data       ;/**/
}Node, * NodeHandle;

typedef struct Stack{
    NodeHandle   base         ;/*栈底*/
    NodeHandle   top          ;/*栈顶*/
    int          size_of_stack;/*栈长*/
    size_t       size_of_data ;/**/
}Stack, * StackHandle;

/******
内部函数
******/
NodeHandle AllocNode(StackHandle S,void * elem)
{/*仅供内部使用专为分配空间*/
    NodeHandle temp ;
    size_t size;
    assert( NULL!=S && NULL != elem);/**/
    size = S->size_of_data;
   
    temp= (NodeHandle)malloc(sizeof(Node));
    assert( NULL != temp);
    (temp->data) = (void *)malloc( size);
   
    memcpy( temp->data, elem , size);   
    return temp;
}
BOOL FreeNode(NodeHandle * N)
{/*删除结点*/
    assert( NULL != *N && NULL !=N);/**/   
    free( (*N)->data);
    free( *N);
    return TRUE;
}

/*******
 外部接口
*******/      
StackHandle InitStack( size_t size)
{/*构造一个空栈*/
    StackHandle S = (StackHandle)malloc(sizeof(Stack));
    assert( NULL !=S);/**/   
    S->top = S->base = NULL;
    S->size_of_stack = 0;
    S->size_of_data  = size;
    return S;
}
BOOL GetTop(StackHandle S,void * elem)
{/*若栈不空,则用elem返回S的栈顶元素,并返回TRUE*/   
    if(S==NULL || S->base == S->top)
        return FALSE;
    memcpy( elem,S->top->data, S->size_of_data);
    return TRUE;
}
BOOL Push(StackHandle S,void * elem)
{/*插入元素,elem为新的栈顶元素*/
    NodeHandle temp;
    assert(NULL !=S);
    assert(NULL !=elem);
   
    temp= AllocNode(S,elem);/*分配一个结点*/
    (S->size_of_stack)++;
   
    temp->prior = S->top;
    S->top = temp;
    return TRUE;
}
BOOL Pop(StackHandle S, void * elem)
{/*若栈不空,则删除S的栈顶元素,并用elem返回其值,并返回TRUE
  elem也可取NULL值,仅做弹出动作*/
    NodeHandle temp;
  
   if(0==S->size_of_stack)/*栈空*/
        return FALSE;
    temp=S->top->prior;
    (S->size_of_stack)--;
    if( NULL != elem)/*如果参数为NULL,则直接弹出*/
        GetTop(S,elem);
    FreeNode( &(S->top));
    S->top = temp;
    return TRUE;
}
BOOL ClearStack(StackHandle S)
{/*把S置为空栈*/   
    assert( NULL !=S);
    while(0!=S->size_of_stack){
       Pop(S,NULL);
    }
    return TRUE;
}
BOOL DestroyStack(StackHandle * S)
{/*销毁栈S*/
    assert(NULL !=S);
    assert(NULL != *S);
    if(0!=(*S)->size_of_stack)
        ClearStack(*S);   
    free( *S);
    *S=NULL;
    return TRUE;
}
BOOL StackEmpty(StackHandle S)
{/*栈空?*/
    assert( NULL !=S );   
    if(0==S->size_of_stack)return TRUE;
    return FALSE;
}
int StackLength(StackHandle S)
{/*栈长*/
    assert(NULL !=S);
    return S->size_of_stack;
}       

               
          
   
           
       

java实现泛型栈

package com.test.common; public class LinkedStack { private class Node{ U item; Node next; ...
  • jianghuihong2012
  • jianghuihong2012
  • 2014年10月20日 10:12
  • 865

C#-—体验泛型栈

/**烟台大学计算机学院学生 *All right reserved. *文件名称:C#-—体验委托 *作者:杨飞 ...
  • u012370105
  • u012370105
  • 2014年10月16日 14:31
  • 438

用数组实现支持泛型的栈,支持动态扩容

用数组实现支持泛型的栈,支持动态扩容
  • qinghai5068
  • qinghai5068
  • 2015年10月16日 20:31
  • 156

C语言实现支持泛型的栈

在这篇博文中我们准备一步一步的使用C来实现一个支持泛型,众所周知,C++ 有模板机制来支撑泛型(所谓的泛型栈其实就是指一个可以存放任何类型包括用户自定义类型的栈),那么对于C我们如何来支持泛型呢,下面...
  • yums467
  • yums467
  • 2014年12月12日 11:07
  • 538

Java 使用泛型实现堆栈类

Java中泛型的一个主要作用就是创造容器类。这里结合泛型实现一个堆栈类。 LinkedStack.java...
  • sunjinshengli
  • sunjinshengli
  • 2017年04月16日 02:10
  • 597

栈的实现与操作(C语言实现)

栈的定义  1, 栈是一种特殊的线性表  2,栈仅能在线性表的一端进行操作  3,栈顶(Top): 允许操作的一端 允许操作的一端  4,栈底(Bottom): ,不允许操作的一端 不允许操作...
  • u010590318
  • u010590318
  • 2014年06月09日 12:16
  • 7534

用C宏写的泛型栈

下面的这个东东是我用C宏写的,在DEV C++4.9.9.0下编译通过. 这个是头文件"stack.h" ===============================================...
  • avalonBBS
  • avalonBBS
  • 2004年10月16日 12:53
  • 1253

自定义实现的一个简单的栈结构

package testJava; import java.util.Arrays; public class MyStack { //设置栈的默认大小 private static int ...
  • baidu_25820069
  • baidu_25820069
  • 2016年10月15日 00:35
  • 723

C语言 实现链栈

#include using namespace std;typedef int DataType; typedef struct stStack { DataType data; ...
  • u010889616
  • u010889616
  • 2015年08月03日 15:53
  • 2802

C语言 实现 链表栈

LinkStack.h 头文件声明如下: #include typedef int DataType; //自定义数据类型,假定为整型 struct Node; ...
  • lutinghuan
  • lutinghuan
  • 2012年04月18日 20:12
  • 11249
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:[库]C实现的泛型栈
举报原因:
原因补充:

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