文档章节

小蚂蚁学习数据结构(28)——题目——顺序栈的遍历输出

嗜学如命的小蚂蚁
 嗜学如命的小蚂蚁
发布于 2016/02/01 19:17
字数 1098
阅读 348
收藏 4

已知栈的顺序存储结构定义如下:

typedef int SElemType;

typedef struct{

    SElemType * base;

    SElemType * top;

    int stacksize;

}SqStact;

下面是依次弹出栈中的所有元素、并逐个输出的类C_算法,操作的结果使栈变成空栈,请填空

void Pop_Print_Sq(SqStack &S);

/*
	顺序栈的操作
	题目要求:依次弹出栈中元素、并逐个输出的类C算法。
*/
# include <stdio.h>
# include <malloc.h>

# define ERROR 0
# define OK	   1
# define STACK_INIT_SIZE 5
# define STACKINCREMENT  1

typedef char Elemtype;
typedef int  Status;

typedef struct stack
{
	Elemtype * base;	//栈底指针
	Elemtype * top;		//栈顶指针
	int stacksize;		//栈总空间
}SqStack;

//栈操作函数前置声明
//初始化一个栈
Status InitStack( SqStack & );
//销毁这个栈
Status DestroyStack( SqStack & );
//清空这个栈
Status ClearStack( SqStack & );
//判断这个栈是否为空
bool StackEmtpy( SqStack & );
//返回这个栈的长度
Status StackLength( SqStack & );
//得到栈顶元素
Status GetTop( SqStack &, Elemtype & );
//往栈中压入一个元素
Status Push( SqStack &, Elemtype );
//弹出一个元素,并且返回弹出元素的值
Status Pop( SqStack &, Elemtype & );
//遍历整个栈
Status StackTraverse( SqStack & );
//题目要求的函数
void Pop_Print_Sq( SqStack & );

//初始化这个栈
Status InitStack( SqStack & S )
{
	/*
		为栈指针分配空间
		PS:malloc分配空间这里,超出后也正常的原因需要重点标注一下。
	*/
	S.base = ( Elemtype * )malloc( sizeof( Elemtype ) * STACK_INIT_SIZE );
	if( NULL == S.base )
	{
		printf( "动态空间分配失败\n" );
		return ERROR;
	}
	S.top = S.base;
	S.stacksize = STACK_INIT_SIZE;
	
	return OK;
}

//向栈中压入一个元素
Status Push( SqStack & S, Elemtype val)
{
	
	if( S.top - S.base >= S.stacksize )
	{
		//如果存储空间已满,就需要增加新的空间
		S.base = ( Elemtype * )realloc( S.base, ( S.stacksize + STACKINCREMENT ) * sizeof( Elemtype ) );
		if( NULL == S.base )
		{
			printf( "动态空间分配失败\n" );
			return ERROR;
		}
		/*
			重新设定栈顶指针top,因为之前top指向的是一个不属于自己的空间,
			现在新开辟了一个属于自己的空间,所以重新指定一下
			万一地址换了也是有可能的!
		*/
		S.top = S.base + S.stacksize;
		//修改结构体中,空间的总大小
		S.stacksize = S.stacksize + STACKINCREMENT;
	}
	
	*S.top = val;
	S.top++;
	return OK;
}

//遍历整个栈
Status StackTraverse( SqStack & S )
{
	if( S.top == S.base )
	{
		return ERROR;
	}
	else
	{
		Elemtype * p = S.base;
		while( p != S.top )
		{
			printf( "%c ", *p );
			p++;
		}
		printf( "\n" );
		
		return OK;
	}
}

//判断这个栈是否为空
bool StackEmtpy( 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, Elemtype & c )
{
	if( S.top == S.base )
	{
		return ERROR;
	}
	else
	{
		c = *(S.top-1);
	}
}

//弹出一个元素,并且返回弹出元素的值
Status Pop( SqStack & S, Elemtype & c )
{
	if( S.top == S.base )
	{
		return ERROR;
	}
	else
	{
		c = *(S.top-1);
		S.top--;
		S.stacksize--;
	}
}

//清空这个栈
Status ClearStack( SqStack & S )
{
	S.top = S.base;
	return OK;
}

//销毁这个栈
Status DestroyStack( SqStack & S )
{
	//释放栈空间
	free( S.base );
	//初始化栈结构体
	S.top  = NULL;
	S.base = NULL;
	S.stacksize = 0;
	
	return OK;
}

/*
	题目要求的函数
	题目貌似没有说是从上往下遍历,还是从下往上遍历
*/
void Pop_Print_Sq( SqStack & S )
{
	while( S.top != S.base )
	{
		S.top--;
		printf( "%c ", *S.top );
	}
}

int main( void )
{
	char c;
	//创建一个栈
	SqStack STA;
	//初始化这个栈
	InitStack( STA );
	//为栈中压入一个元素
	Push( STA, 'a' );
	Push( STA, 'b' );
	Push( STA, 'c' );
	Push( STA, 'd' );
	Push( STA, 'e' );
	Push( STA, 'f' );
	Push( STA, 'g' );
	Push( STA, 'h' );
	Push( STA, 'i' );
	Push( STA, 'j' );
	Push( STA, 'k' );
	//遍历这个栈
	printf( "压入元素从a~k,遍历这个栈:\n" );
	StackTraverse( STA );
	
	printf( "判断这个栈是否为空?" );
	if( StackEmtpy( STA ) )
	{
		printf( "这个栈为空\n" );
	}
	else
	{
		printf( "这个栈不为空\n" );
	}
	
	printf( "该链表的长度为:%d\n", StackLength( STA ) );
	
	GetTop( STA, c );
	printf( "目前栈顶元素为:%c\n", c );
	
	Pop( STA, c );
	printf( "弹出的栈顶元素为:%c\n此刻的栈中元素是:", c );
	StackTraverse( STA );
	
	//题目要求的函数
	printf( "依次弹出栈中元素、并将栈清空:\n" );
	Pop_Print_Sq( STA );
	StackTraverse( STA );
	printf( "\n" );
	//清空这个栈
	ClearStack( STA );
	StackTraverse( STA );
	
	//销毁这个栈
	DestroyStack( STA );
	
	return 0;
}
/*
	VC++6.0输出的结果是
	========================================
	压入元素从a~k,遍历这个栈:
	a b c d e f g h i j k
	判断这个栈是否为空?这个栈不为空
	该链表的长度为:11
	目前栈顶元素为:k
	弹出的栈顶元素为:k
	此刻的栈中元素是:a b c d e f g h i j
	依次弹出栈中元素、并将栈清空:
	j i h g f e d c b a
	========================================
	总结:
		整体上没有什么难度,之前写过链表的栈,趁着这个机会把顺序栈也
		练习一下。在malloc那里有点迷糊了,由于字数比较多,就在下面单独
		总结吧。
*/


    学PHP的小蚂蚁 博客 http://my.oschina.net/woshixiaomayi/blog



© 著作权归作者所有

共有 人打赏支持
嗜学如命的小蚂蚁
粉丝 142
博文 161
码字总数 100864
作品 0
郑州
程序员
私信 提问
数据结构与算法(3)——树(二叉、二叉搜索树)

前言:题图无关,现在开始来学习学习树相关的知识 前序文章: 数据结构与算法(1)——数组与链表(https://www.jianshu.com/p/7b93b3570875) 数据结构与算法(2)——栈和队列(https://www.ji...

我没有三颗心脏
2018/07/11
0
0
若干数据结构 && 算法面试题【四】(更新ing)

这是我的第三个面试题汇总。 想看之前的内容请移步 http://zhweizhi.blog.51cto.com/10800691/1763237 若干数据结构 && 算法面试题【一】更新完毕 http://zhweizhi.blog.51cto.com/10800691/...

shangluyi
2016/07/08
0
0
数据结构课程主页-2016级

  新学期,再度起程!   翻转的数据结构课程再度迎来新的一批同学。   前两年,资源建设基本完备,课堂方案逐渐完善,同学们对新型的学习方式设计给予了肯定(参见2014级问卷调查和201...

sxhelijian
2017/08/30
0
0
Java 程序员必须掌握的 8 道数据结构面试题,你会几道?

瑞士计算机科学家Niklaus Wirth在1976年写了一本书,名为《算法+数据结构=编程》。 40多年后,这个等式仍被奉为真理。这就是为什么在面试过程中,需要考察软件工程师对数据结构的理解。 几乎...

JAVA高级架构开发
2018/10/07
0
0
编程题——1~10

一、CMyString类的实现(主要是构造函数、拷贝构造函数、赋值运算符、异常安全性) 二、Singleton的实现 1、ns3里的实现 实现程序如下: 2、《C++设计新思维》第6章 多线程实现程序如下: 三...

thanatos_y
2016/07/19
3
0

没有更多内容

加载失败,请刷新页面

加载更多

数据库篇多表操作

第1章 多表操作 实际开发中,一个项目通常需要很多张表才能完成。例如:一个商城项目就需要分类表(category)、商品表(products)、订单表(orders)等多张表。且这些表的数据之间存在一定的关系...

stars永恒
32分钟前
1
0
nginx日志自动切割

1.日志配置(Nginx 日志) access.log----记录哪些用户,哪些页面以及用户浏览器,IP等访问信息;error.log------记录服务器错误的日志 #配置日志存储路径:location / {      a...

em_aaron
昨天
1
0
java 反射

基本概念 RTTI,即Run-Time Type Identification,运行时类型识别。RTTI能在运行时就能够自动识别每个编译时已知的类型。   要想理解反射的原理,首先要了解什么是类型信息。Java让我们在运...

细节探索者
昨天
1
0
推荐转载连接

https://www.cnblogs.com/ysocean/p/7409779.html#_label0

小橙子的曼曼
昨天
3
0
雷军亲自打造的套餐了解下:用多少付多少

12月28日消息,小米科技创始人兼CEO雷军微博表示,小米移动任我行套餐方案,原则上就是明明白白消费,用多少付多少,不用不花钱!上网、电话和短信都是一毛钱,上网0.1元/M,电话0.1元/分钟,...

linuxCool
昨天
6
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部