头文件 head.h
#include<string.h>
#include<ctype.h>
#include<malloc.h> /* malloc()等 */
#include<limits.h> /* INT_MAX等 */
#include<stdio.h> /* EOF(=^Z或F6),NULL */
#include<stdlib.h> /* atoi() */
#include<io.h> /* eof() */
#include<math.h> /* floor(),ceil(),abs() */
#include<process.h> /* exit() */
/* 函数结果状态代码 */
#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define INFEASIBLE -1
/* #define OVERFLOW -2 因为在math.h中已定义OVERFLOW的值为3,故去掉此行 */
typedef int Status; /* Status是函数的类型,其值是函数结果状态代码,如OK等 */
typedef int Boolean; /* Boolean是布尔类型,其值是TRUE或FALSE */
#define STACK_INIT_SIZE 10
#define STACKINCERMENT 2
typedef int SElemType;
typedef struct {
SElemType *base;
SElemType *top;
int stacksize;
}SqStack;
Status InitStack(SqStack *S);
Status DestoryStack(SqStack *S);
Status ClearStack(SqStack *S);
Status StackEmpty(SqStack S);
int StackLength(SqStack S);
Status GetTop(SqStack S, SElemType *e);
Status Push(SqStack *S, SElemType e);
Status Pop(SqStack *S, SElemType *e);
Status StackTraverse(SqStack S);
Status StackTraverseBack(SqStack S);
算法实现
#include"head.h"
Status InitStack(SqStack *S)
{
//构造一个空栈S
(*S).base = (SElemType *)malloc(STACK_INIT_SIZE*sizeof(SElemType));
if (!((*S).base))
{
printf("初始化空间失败!\n");
return ERROR;
}
else
{
(*S).top = (*S).base; //注意赋值的顺序
(*S).stacksize = STACK_INIT_SIZE;
return OK;
}
}
Status DestoryStack(SqStack *S)
{
(*S).top = (*S).base;
free((*S).base);
//若base的值为NULL,则表明栈结构不存在
(*S).base = NULL;
(*S).top = NULL;
(*S).stacksize = 0;
return OK;
}
Status ClearStack(SqStack *S)
{
//容量保持不变
(*S).top = (*S).base;
return OK;
}
Status StackEmpty(SqStack S)
{
if (S.base != S.top)
return ERROR;
else
return OK;
}
int StackLength(SqStack S)
{
return S.top - S.base;
}
Status GetTop(SqStack S, SElemType *e)
{
//判断栈是否为空
if (S.top == S.base)
return ERROR;
*e = *(S.top - 1);
return OK;
}
Status Push(SqStack *S, SElemType e)
{
//首先判断空间是否充裕
if (((*S).top - (*S).base) >= ((*S).stacksize))
{
(*S).base = (SElemType *)realloc((*S).base, ((*S).stacksize + STACKINCERMENT)*sizeof(SElemType));
if (!((*S).base))
{
printf("重新分配空间失败!\n");
return ERROR;
}
(*S).top = (*S).base + (*S).stacksize;
(*S).stacksize += STACKINCERMENT;
}
*((*S).top) = e;
(*S).top++;
return OK;
}
Status Pop(SqStack *S, SElemType *e)
{
//判断栈是否为空
if ((*S).base == (*S).top)
return ERROR;
*e = *((*S).top - 1);
(*S).top--;
return OK;
}
Status StackTraverse(SqStack S)
{
SElemType *s;
if (S.base == S.top)
return ERROR;
s = S.base;
while (s < S.top)
{
printf("%d ", *s);
s++;
}
printf("\n");
return OK;
}
Status StackTraverseBack(SqStack S)
{
SElemType e;
if (S.base == S.top)
return ERROR;
while (!StackEmpty(S))
{
Pop(&S, &e);
printf("%d ", e);
}
printf("\n");
return OK;
}
#include"head.h"
void main()
{
int j;
SqStack s;
SElemType e;
if (InitStack(&s) == OK)
for (j = 1; j <= 12; j++)
Push(&s, j);
printf("栈中元素依次为:");
StackTraverse(s);
Pop(&s, &e);
printf("弹出的栈顶元素 e=%d\n", e);
printf("栈空否:%d(1:空 0:否)\n", StackEmpty(s));
GetTop(s, &e);
printf("栈顶元素 e=%d 栈的长度为%d\n", e, StackLength(s));
ClearStack(&s);
printf("清空栈后,栈空否:%d(1:空 0:否)\n", StackEmpty(s));
DestoryStack(&s);
printf("销毁栈后,s.top=%u s.base=%u s.stacksize=%d\n", s.top, s.base, s.stacksize);
system("pause");
}
Running Result:
栈中元素依次为:1 2 3 4 5 6 7 8 9 10 11 12
弹出的栈顶元素 e=12
栈空否:0(1:空 0:否)
栈顶元素 e=11 栈的长度为11
清空栈后,栈空否:1(1:空 0:否)
销毁栈后,s.top=0 s.base=0 s.stacksize=0
请按任意键继续. . .