前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >链表实现栈的动态顺序存储实现—C语言

链表实现栈的动态顺序存储实现—C语言

作者头像
WindCoder
发布2018-09-20 16:05:13
9750
发布2018-09-20 16:05:13
举报
文章被收录于专栏:WindCoderWindCoder

头文件

ElemType.h

代码语言:javascript
复制
/***
*ElemType.h - ElemType的定义
*
****/

#ifndef ELEMTYPE_H
#define ELEMTYPE_H

typedef int ElemType;

int  compare(ElemType x, ElemType y);
void visit(ElemType e);

#endif /* ELEMTYPE_H */

 DynaSeqStack.h

代码语言:javascript
复制
/***
*DynaSeqStack.h - 动态顺序栈的定义
*
****/

#if !defined(DYNASEQSTACK_H)
#define DYNASEQSTACK_H

#include "ElemType.h"

/*------------------------------------------------------------
// 栈结构的定义
------------------------------------------------------------*/
typedef struct Stack
{
	ElemType *base;				// 栈基址
	ElemType *top;				// 栈顶
	int stacksize;				// 栈存储空间的尺寸
} SqStack;

/*------------------------------------------------------------
// 栈的基本操作
------------------------------------------------------------*/

bool InitStack(SqStack *S);
void DestroyStack(SqStack *S);
bool StackEmpty(SqStack S);
int  StackLength(SqStack S);
bool GetTop(SqStack S, ElemType *e);
void StackTraverse(SqStack S, void (*fp)(ElemType));
bool Push(SqStack *S, ElemType e);
bool Pop(SqStack *S, ElemType *e);

#endif /* DYNASEQSTACK_H */

 主函数文件

Lab.cpp

代码语言:javascript
复制
#include <stdio.h>
#include <stdlib.h>
#include "DynaSeqStack.h"

const int STACK_INIT_SIZE = 100; 	// 初始分配的长度
const int STACKINCREMENT  = 10;		// 分配内存的增量


int main()
{
	SqStack S;

    InitStack(&S);
	Push(&S,12);
	system("pause");
	return 0;
}

实现函数文件

ElemType.cpp

代码语言:javascript
复制
/***
*ElemType.cpp - ElemType的实现
*
****/

#include <stdio.h>
#include "ElemType.h"

int compare(ElemType x, ElemType y)
{
	return(x-y);
}

void visit(ElemType e)
{
	printf("%dn", e);
}

DynaSeqStack.cpp

代码语言:javascript
复制
/***
*DynaSeqStack.cpp - 动态顺序栈,即栈的动态顺序存储实现
*
*
*题目:实验3-1 栈的动态顺序存储实现
*
*
*
*
****/

#include <stdlib.h>
#include <malloc.h>
#include <memory.h>
#include <assert.h>
#include "DynaSeqStack.h"

const int STACK_INIT_SIZE = 100;	// 初始分配的长度
const int STACKINCREMENT  = 10;		// 分配内存的增量

/*------------------------------------------------------------
操作目的:	初始化栈
初始条件:	无
操作结果:	构造一个空的栈
函数参数:
		SqStack *S	待初始化的栈
返回值:
		bool		操作是否成功
------------------------------------------------------------*/
bool InitStack(SqStack *S)
{
     S->base = S->top = (ElemType *)malloc(sizeof(ElemType)*STACK_INIT_SIZE);
	 if (!S->base)
	 {
		 return false;
	 }
	S->stacksize = STACK_INIT_SIZE;
	return true;
}

/*------------------------------------------------------------
操作目的:	销毁栈
初始条件:	栈S已存在
操作结果:	销毁栈S
函数参数:
		SqStack *S	待销毁的栈
返回值:
		无
------------------------------------------------------------*/
void DestroyStack(SqStack *S)
{
	free(S->base);
	S->top = S->base = NULL;
}

/*------------------------------------------------------------
操作目的:	判断栈是否为空
初始条件:	栈S已存在
操作结果:	若S为空栈,则返回true,否则返回false
函数参数:
		SqStack S	待判断的栈
返回值:
		bool		是否为空
------------------------------------------------------------*/
bool StackEmpty(SqStack S)
{
	if (S.base == S.top)
	{
        return true;
	}
	return false;
}

/*------------------------------------------------------------
操作目的:	得到栈的长度
初始条件:	栈S已存在
操作结果:	返回S中数据元素的个数
函数参数:
		SqStack S	栈S
返回值:
		int			数据元素的个数
------------------------------------------------------------*/
int StackLength(SqStack S)
{

	return (S.top - S.base);
;
}

/*------------------------------------------------------------
操作目的:	得到栈顶元素
初始条件:	栈S已存在
操作结果:	用e返回栈顶元素
函数参数:
		SqStack S	栈S
		ElemType *e	栈顶元素的值
返回值:
		bool		操作是否成功
------------------------------------------------------------*/
bool GetTop(SqStack S, ElemType *e)
{
	if (!S.base)
	{
		*e = *(S.top-1);
		return true;
	}
	return false;
}

/*------------------------------------------------------------
操作目的:	遍历栈
初始条件:	栈S已存在
操作结果:	依次对S的每个元素调用函数fp
函数参数:
		SqStack S		栈S
		void (*fp)()	访问每个数据元素的函数指针
返回值:
		无
------------------------------------------------------------*/
void StackTraverse(SqStack S, void (*fp)(ElemType))
{
	for (;S.base<S.top;S.base++)
	{
		fp(*S.base);

	}
}

/*------------------------------------------------------------
操作目的:	压栈——插入元素e为新的栈顶元素
初始条件:	栈S已存在
操作结果:	插入数据元素e作为新的栈顶
函数参数:
		SqStack *S	栈S
		ElemType e	待插入的数据元素
返回值:
		bool		操作是否成功
------------------------------------------------------------*/
bool Push(SqStack *S, ElemType e)
{
	if ((S->top - S->base)==S->stacksize)
	{
		//1.分配大一点的空间
		ElemType *newbase = (ElemType*)malloc(sizeof(ElemType)*(S->stacksize+STACKINCREMENT));
		if (!newbase)
		{
			return false;
		}
		//2.复制元素到新的空间
		memcpy(newbase,S->base,sizeof(ElemType)*S->stacksize);
		//3.销毁原储存空间
		free(S->base);

		//4.栈顶指针、栈顶指针
		S->base = newbase;
		S->top = S->base+S->stacksize;
		S->stacksize = S->stacksize+STACKINCREMENT;

	}
	*(S->top) = e;
	S->top++;
	return true;
}

/*------------------------------------------------------------
操作目的:	弹栈——删除栈顶元素
初始条件:	栈S已存在且非空
操作结果:	删除S的栈顶元素,并用e返回其值
函数参数:
		SqStack *S	栈S
		ElemType *e	被删除的数据元素值
返回值:
		bool		操作是否成功
------------------------------------------------------------*/
bool Pop(SqStack *S, ElemType *e)
{
	*e = *(--S->top);
	return true;
}
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2014-11-18,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 头文件
    • ElemType.h
      •  DynaSeqStack.h
      •  主函数文件
        • Lab.cpp
        • 实现函数文件
          • ElemType.cpp
            • DynaSeqStack.cpp
            相关产品与服务
            对象存储
            对象存储(Cloud Object Storage,COS)是由腾讯云推出的无目录层次结构、无数据格式限制,可容纳海量数据且支持 HTTP/HTTPS 协议访问的分布式存储服务。腾讯云 COS 的存储桶空间无容量上限,无需分区管理,适用于 CDN 数据分发、数据万象处理或大数据计算与分析的数据湖等多种场景。
            领券
            问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档