前面我们讲到了容器,今天我们接着讨论另外一种数据结构:
堆栈。堆栈几乎是程序设计的命脉,没有堆栈就没有函数调用,当然也就没有软件设计。

那么堆栈有什么特殊的属性呢?其实,堆栈的属性主要表现在下面两个方面:

1)堆栈的数据是先入后出

2)堆栈的长度取决于栈顶的高度

那么,作为连续内存类型的堆栈应该怎么设计呢?大家可以自己先试一下:

#ifndef _stack_h
#define _stack_h


#include
<stdio.h>
#include
<stdlib.h>
#define EMPTYSTACK -1
#define MINSTACKSIZE 5


typedef
struct stackRecord
{
    
int
capacity;
    
int
topOfStack;
    
void **
array;
}
*
stack;
//stack s ==> struct stackRecord * s;
int
isEmpty(stack s);
int
isFull(stack s);

stack createStack(int maxElementsNumber);
void
disposeStack(stack s);
int push(void *
e, stack s);
void *
top_element(stack s);
int
pop(stack s);
void *
topAndPop(stack s);
int
getStackLength(stack s);

#endif

#include "stack.h"

int main(int argv, char *
argc[])
{
     stack s;
     s
= createStack(5
);
     push((
void *)5
, s);
     printf(
"The Stack's length is %d "
, getStackLength(s));

     push((
void *)6
, s);
     printf(
"The Stack's length is %d "
, getStackLength(s));

     printf(
"The top element is %d ", (int
)top_element(s));
     pop(s);

     printf(
"The Stack's length is %d "
, getStackLength(s));
     pop(s);
   
//
pop(s);
   
// disposeStack(s);
     pop(s);
     push((
void*)8
,s);
     printf(
"The top element is %d ", (int
)top_element(s));
    
return 0
;
}

int
isEmpty(stack s)
{
  return s->topOfStack ==
EMPTYSTACK;
}

int
isFull(stack s)
{
  return (s->topOfStack + 1) == s->
capacity;
}
void
disposeStack(stack s)
{
    s
->topOfStack = -1
;

   
if (s !=
NULL) {
        free(
*s->
array);
       
*s->array =
NULL;
        free(s
->
array);
        s
->array =
NULL;
  
//   free(s);
    }
}

stack createStack(
int
maxElements)
{
    stack s
= (stack)malloc(sizeof(struct
stackRecord));

   
if (maxElements <
MINSTACKSIZE)
        perror(
"Stack size is too small."
);
   
if (s ==
NULL)
        perror(
"Out of space!"
);

    s
->array = (void **)malloc(sizeof(void *) *
maxElements);
    s
->capacity =
maxElements;
    s
->topOfStack = -1
;

   
return
s;
}

int push(void *
e, stack s)
{
   
if (!
isFull(s))
    {
        s
->array[++s->topOfStack] =
e;
       
return 0
;
    }
   
else
        return 1
;
}

/* when the stack is empty it'll return 0 */
void *
top_element(stack s)
{
      if (!
isEmpty(s))
            
return s->array[s->
topOfStack];
      
else
            return
NULL;
}

int
pop(stack s)
{
   
if (!
isEmpty(s))
    {
        s
->array[s->topOfStack--] = ''
;
       
return 0
;
    }
   
else

    {
        printf(
"it is empty ! ");
       
return 1
;
    }
}

void *
topAndPop(stack s)
{
   
void *
e;
     e
=
top_element(s);
     pop(s);
     
return
e;
}
int
getStackLength(stack s)
{
  return (s->topOfStack+1
) ;
}

原文地址:https://www.cnblogs.com/chengliangsheng/p/3597084.html