本次是采用大程序结构,涉及多个代码段
1.ci.h——包括一些头文件和预定义
//c1.h
#include<string.h>
#include<ctype.h>
#include<malloc.h>
#include<limits.h>
#include<stdio.h>
#include<stdlib.h>
#include<io.h>
#include<math.h>
#include<sys/timeb.h>
#include<stdarg.h>
//函数结果状态码
#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
typedef int Status;
typedef int Boolean;
2.c3-1.h——顺序栈的存储结构
//c3-1.h
typedef int SElemType;
#define STACK_INIT_SIZE 10 //存储空间初始分配量
#define STACK_INCREMENT 2 //存储空间分配增量
struct SqStack
{
SElemType *base;
SElemType *top;
int stacksize;
};
3.bo3-1——基本操作函数
void 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; //存储空间为初始分配量
}
void DestroyStack(SqStack &S)
//销毁栈
{
free(S.base);
S.top = S.base = NULL; //栈顶、栈底指针均为空
S.stacksize = 0; //当前已分配存储空间为0
}
void ClearStack(SqStack &S)
//把栈清空
{
S.top = S.base; //栈顶指针指向栈底
}
Status StackEmpty(SqStack S)
//判断栈空
{
if (S.top == S.base) //空栈条件
return TRUE;
else
return FALSE;
}
int StackLength(SqStack S)
//返回栈元素个数,即栈的长度
{
return S.top - S.base;
}
Status GetTop(SqStack S, SElemType &e)
//获取栈顶元素
{
if (S.top > S.base)
{
e = *(S.top - 1);
return OK;
}
else
return ERROR;
}
void Push(SqStack &S, SElemType e)
//压栈, 插入元素为e的新的栈顶元素
{
if (S.top - S.base == S.stacksize) //栈满,追加空间
{
S.base = (SElemType *)realloc(S.base, (S.stacksize + STACK_INCREMENT) * sizeof(SElemType));
if (!S.base)
exit(OVERFLOW);
S.top = S.base + S.stacksize; //修改栈顶指针,指向新的栈顶
S.stacksize += STACK_INCREMENT; //更新当前已分配的存储空间
}
*(S.top++) = e; //e入栈,成为新的栈顶元素,栈顶指针上移
}
Status Pop(SqStack &S, SElemType &e)
{
if (S.top == S.base)
return ERROR;
e = *--S.top; //栈顶指针下移一个存储单元, 将栈顶元素赋值给e
return OK;
}
void StackTraverse(SqStack S, void(*visit)(SElemType))
//从栈底到栈顶依次对栈中每个元素调用visit()
{
SElemType *p = S.base;
while (S.top > p)
{
visit(*p++); //调用visit(),p指针上移一个存储单元
}
printf("\n");
}
4.func2-2.h——功能函数
//func2-2 几个常用函数
#define ElemType SElemType
Status equal(ElemType c1, ElemType c2)
//判断是否相等
{
if (c1 == c2)
return true;
else
return false;
}
int comp(ElemType a, ElemType b)
//根据a<,=,>b,分别返回-1,0,1
{
if (a == b)
return 0;
else
return (a - b) / abs(a - b);
}
void print(ElemType c)
//十进制输出
{
printf("%d ", c);
}
void print1(ElemType &c)
//十进制输出(引用类型)
{
printf("%d ", c);
}
void print2(ElemType c)
//以字符格式输出
{
printf("%c ", c);
}
5.主函数
#include"c1.h"
#include"c3-1.h"
#include"bo3-1.h"
#include"func2-2.h"
int main()
{
int j;
SqStack s;
SElemType e;
InitStack(s);
for (j = 1; j <= 12; j++)
{
Push(s, j);
}
printf("栈中元素依次为: ");
StackTraverse(s, print);
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));
DestroyStack(s);
printf("销毁栈后,s.top = %p, s.base = %p, s.stacksize = %d\n", s.top, s.base, s.stacksize);
return 0;
}
本文详细介绍了使用C语言实现顺序栈的数据结构,包括初始化、销毁、清空、判断空栈、获取栈长度、获取栈顶元素、压栈、弹栈及遍历栈等功能。通过具体代码示例展示了如何构建和操作顺序栈。
2427

被折叠的 条评论
为什么被折叠?



