前面我们讲到了容器,今天我们接着讨论另外一种数据结构:
堆栈。堆栈几乎是程序设计的命脉,没有堆栈就没有函数调用,当然也就没有软件设计。
那么堆栈有什么特殊的属性呢?其实,堆栈的属性主要表现在下面两个方面:
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\n",
getStackLength(s));
push((void
*)6,
s);
printf("The Stack‘s length is %d\n",
getStackLength(s));
printf("The top element is %d\n",
(int)top_element(s));
pop(s);
printf("The Stack‘s length is %d\n", getStackLength(s));
pop(s);
//
pop(s);
//
disposeStack(s);
pop(s);
push((void*)8,s);
printf("The
top element is %d\n", (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--] = ‘\0‘;
return 0;
}
else
{
printf("it
is empty !\n");
return 1;
}
}
void *topAndPop(stack
s)
{
void
*e;
e
=
top_element(s);
pop(s);
return e;
}
int
getStackLength(stack s)
{
return (s->topOfStack+1)
;
}
原文:http://www.cnblogs.com/chengliangsheng/p/3597084.html