《数据结构c语言版》之栈的顺序表示和实现

建立一个工作空间
1.新建status.h

#ifndef STATUS_H
#define STATUS_H
//函数结果状态代码
#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR  0
#define INFEASIBLE -1
#define OVERFLOW -2
//Status是函数的类型,其值是函数结果状态代码
typedef int Status;
 typedef char SElemType;
typedef int ElemType;
#endif

2.创建ZhanXunXu.h

#ifndef ZHANSHUNXU_H
#define ZHANSHUNXU_H
#include "status.h"

typedef struct{
   SElemType *base;
   SElemType *top;
   int stacksize;
}SqStack;
#define STACK_INIT_SIZE 100
#define STACKINCREMENT 10
//1.构建一个空栈 
Status InitStack(SqStack *S);
//2.销毁栈 
Status DestroyStack(SqStack *S);
//3.清空栈 
Status ClearStack(SqStack *S);
//4.判断栈是否为空 
Status StackEmpty(SqStack S);
//5.求栈的长度 
Status StackLength(SqStack S);
//6.//求栈顶元素 
Status GetTop(SqStack S, SElemType *e);
//7.栈顶插入元素 
Status Push(SqStack *S, SElemType e);
//8.删除栈顶元素 
Status Pop(SqStack *S, SElemType *e);
//9.遍历栈 
Status StackTraverse(SqStack S,int(*vist)(SElemType));
#endif

3.ZhanShunXu.c

#include "zhanShunxu.h"
#include <stdio.h>
//1.构建一个空栈 
Status InitStack(SqStack *S)
{   
    (*S).base = (SElemType*)malloc(STACK_INIT_SIZE*sizeof(SElemType));
        if(!(*S).base)      exit(OVERFLOW);	  //存储分配失败	
        (*S).top = (*S).base;
        (*S).stacksize = STACK_INIT_SIZE;	
        return OK;
} 

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+STACKINCREMENT)*sizeof(SElemType));
                if(!(*S).base)      exit(OVERFLOW);	//存储分配失败
               (*S).top = (*S).base + (*S).stacksize;
               (*S).stacksize += STACKINCREMENT;
         }
        *(S->top) = e;	//进栈先赋值,栈顶指针再自增 
        (S->top)++;
         return OK;
} 
Status  Pop(SqStack *S, SElemType *e)
{
       if((*S).top==(*S).base)   return ERROR;
        (*S).top--;	//出栈栈顶指针先递减,再赋值 
        *e = *((*S).top);
        return OK;
}
Status StackEmpty(SqStack S){
  //若栈为空,返回true;否则返回FALSE 
 if(S.top==S.base) 
   return TRUE;
 else 
    return FALSE; 
} 
Status StackLength(SqStack S){//顺序栈S
  return S.top-S.base; 
	
}
Status ClearStack(SqStack *S){
	if((*S).base)(*S).top=(*S).base;//栈底栈顶相同为空栈 
	return OK; 
}
Status DestroyStack(SqStack *S){
	 if((*S).base){
 	 free((*S).base);
 		(*S).stacksize=0;
 		(*S).base=(*S).top=NULL;
 	}
 	return OK;
}
Status StackTraverse(SqStack S,int (*visit)(SElemType)){
	while(S.top>S.base)
	visit(*S.base++);
	printf("\n");
	return OK;
	

}

4ZhanShunXu_main.c

#include "zhanShunxu.h"
#include <stdio.h>
void main(){
		int visit(SElemType c){
  printf("%d",c);
  return OK;	
}
  int j;
  SElemType e;
	SqStack S;

	//创建一个顺序栈 
	if(InitStack(&S)==1)
	printf("顺序栈创建成功!\n");
	//查看栈的长度
	printf("站的长度为%d\n",StackLength(S));
	//查看是否为空栈
	printf("栈是否为空:%d (1:空 0:否)\n",StackEmpty(S));
	//初始化
	for(j=1;j<=12;j++) {
		Push(&S,j);
	}
	printf("栈中元素依次为:");
	StackTraverse(S,visit);
	Pop(&S,&e);
	printf("弹出的栈顶元素为:e=%d\n",e);
	printf("站是否为空:%d",StackEmpty(S));
	GetTop(S,&e);
	printf("栈顶元素e=%d 栈的长度为%d\n",e,StackLength(S));
	ClearStack(&S);
	printf("清空后栈空否:%d(1:kong 0 否)\n",StackEmpty(S));
	DestroyStack(&S);
	printf("销毁战后 S.top=%u S.base=%u S.stacksize=%d\n",S.top,S.base,S.stacksize);
	
	
}

猜你喜欢

转载自blog.csdn.net/qq_43615815/article/details/90140247