文档章节

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

嗜学如命的小蚂蚁
 嗜学如命的小蚂蚁
发布于 2016/02/01 19:17
字数 1098
阅读 333
收藏 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...

我没有三颗心脏
07/11
0
0
数据结构课程主页-2016级

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

sxhelijian
2017/08/30
0
0
若干数据结构 && 算法面试题【四】(更新ing)

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

shangluyi
2016/07/08
0
0
剑指Offer学习总结-从尾到头打印链表

剑指Offer学习总结-从尾到头打印链表 本系列为剑指Offer学习总结,主要是代码案例的分析和实现: 书籍链接:http://product.dangdang.com/24242724.html 原作者博客:http://zhedahht.blog....

wwlcsdn000
01/16
0
0
数据结构笔记(2)——二叉查找树

title: 数据结构笔记(2)——二叉查找树 date: 2018-01-11 20:48:59 tags: 数据结构 categories: code --- 数据结构中的二叉查找树,各种顺序的遍历方式。 树 定义: 一颗树是一些节点的结合...

张秣
10/23
0
0

没有更多内容

加载失败,请刷新页面

加载更多

小白带你认识netty(三)之NioEventLoop的线程(或者reactor线程)启动(一)

在第一章中,我们看关于NioEventLoopGroup的初始化,我们知道了NioEventLoopGroup对象中有一组EventLoop数组,并且数组中的每个EventLoop对象都对应一个线程FastThreadLocalThread,那么这个...

天空小小
今天
2
0
PHP动态扩展Redis模块

查看已有模块 [root@test-a ~]# /usr/local/php/bin/php -m[PHP Modules]bz2Core...zlib[Zend Modules] 下载包,解压,生成configure文件 [root@test-a ~]# cd /usr/local/src/[ro......

野雪球
今天
2
0
在Ignite中使用线性回归算法

在本系列前面的文章中,简单介绍了一下Ignite的机器学习网格,下面会趁热打铁,结合一些示例,深入介绍Ignite支持的一些机器学习算法。 如果要找合适的数据集,会发现可用的有很多,但是对于...

李玉珏
今天
3
0
Mybatis应用学习——简单使用示例

1. 传统JDBC程序中存在的问题 1. 一个简单的JDBC程序示例: public class JDBCDemo {public static void main(String[] args) {Connection con=null;PreparedStatement statemen...

江左煤郎
今天
4
0
使用JavaScript编写iOS应用业务逻辑

JSAUIKitCocoa使你可以使用JavaScript编写对性能要求不高但可能变动性很大的iOS应用的业务逻辑部分,View组件、需要多线程支持的Model等则直接使用原生对象。 编写方式与React Native相似,但...

neal01
今天
5
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部