考研党 数据结构(严蔚敏)Stack基本操作(纯C语言,与教材一致)
#include <stdio.h>
#include <stdlib.h>
#define STACK_INIT_LENGTH 20
#define STACK_INCREMENT 10
#define OK 1
#define ERROR -1
typedef int Status;
typedef int ElemType;
typedef struct
{
ElemType* top;
ElemType* base;
int size;
} Stack;
/*******函数声明*******/
Status initStack(Stack* s);
Status increaseStack(Stack* s);
Status clearStack(Stack* s);
Status destoryStack(Stack* s);
Status push(Stack* s,ElemType e);
Status pop(Stack* s, ElemType* e);
int isEmptyStack(Stack s);
int getStackSize(Stack s);
int getStackLength(Stack s);
void printElem(ElemType e);
void printStack(Stack s);
/*******函数定义*******/
//打印单个元素
void printElem(ElemType e)
{
printf("%-4d", e);
}
//初始化堆栈
Status initStack(Stack* s)
{
s->base = (ElemType*)malloc( sizeof(ElemType)*STACK_INIT_LENGTH );
if( !s->base)
{
return ERROR;//exit(0);
}
s->top = s->base;
s->size = STACK_INIT_LENGTH;
return OK;
}
//打印堆栈
void printStack(Stack s)
{
const ElemType* top = s.top;
const ElemType* base = s.base;
while( top != base)
{
top--;
printElem(*top);
}
printf("\n");
}
//弹出元素
Status pop(Stack* s, ElemType* e)
{
if( getStackLength(*s) == 0)
{
return ERROR;
}
s->top--;
*e = *s->top;
return OK;
}
//压入元素
Status push(Stack* s, ElemType e)
{
if( getStackLength(*s) == getStackSize(*s) )
{
int flag = increaseStack(s);
if( OK != flag)
{
return ERROR;
}
}
*s->top = e;
s->top++;
return OK;
}
//清空堆栈
Status clearStack(Stack* s)
{
s->top = s->base;
return OK;
}
//扩充堆栈的空间
Status increaseStack(Stack* s)
{
s->base = (ElemType*)realloc( s->base, sizeof(ElemType)* (s->size + STACK_INCREMENT));
if( !s->base )
{
return ERROR;//exit(0);
}
s->top = s->base + s->size;
s->size += STACK_INCREMENT;
return OK;
}
//获取堆栈大小
int getStackSize(Stack s)
{
return s.size;
}
//获取堆栈长度
int getStackLength(Stack s)
{
return s.top - s.base;
}
//销毁堆栈
Status destoryStack(Stack* s)
{
if( !s->base)
{
return ERROR;
}
free(s->base);
s->size = 0;
return OK;
}
//判断堆栈是否存在元素
int isEmptyStack(Stack s)
{
if( s.top == s.base)
return 1;
return 0;
}
//main.c
/*堆栈测试 纯C语言*/
#include <stdio.h>
#include "Stack2.h"
#include <stdlib.h>
#include <time.h>
#define COUNT 12
int main(int argc, char const *argv[])
{
srand((unsigned int)time(0));
int i = 0;
Stack s;
initStack(&s);//初始化
//循环压入元素
printf("push元素:\n");
for (i = 0; i < COUNT; ++i)
{
ElemType e = rand()%100;
push(&s, e);
printf("Length:%-4d Content: ",getStackLength(s));
printStack(s);
}
//依次弹出元素
printf("pop元素:\n");
for (i = 0; i < COUNT; ++i)
{
ElemType e = 0;
pop(&s, &e);
printf("StackLength:%-4d poped:",getStackLength(s));
printElem(e);
printf("\n");
}
//查看堆栈元素是否为空
printf("Stack is %s Empty\n", isEmptyStack(s)?"":"not");
//最后压入测试
push(&s, 100);
//最后判断堆栈是否为空
printf("Stack is %s Empty\n", isEmptyStack(s)?"":"not");
//销毁堆栈
destoryStack(&s);
printf("Stack is destoried\n");
return 0;
}
本代码示例为纯C语言编写的Stack基本操作,与数据结构(严蔚敏)课本讲述内容一致,可用于考研同学复习数据结构。
代码编译使用软件为Dev-cpp,代码与实际开发一定有不同,但是写代码的目的主要是为了理解数据结构的思想并掌握它。算法很美。
文件结构
Stack2.h(定义基本操作类型)
main.c(编写main函数进行测试)
祝愿18考研学生成功。