文档章节

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

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



© 著作权归作者所有

共有 人打赏支持
嗜学如命的小蚂蚁
粉丝 137
博文 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
编程题——21~30

二十一、包含min函数的栈 定义栈的数据结构,请在该类型中实现一个能够得到栈的最小元素的min函数。在该栈中,调 用min、push及pop的时间复杂度都是O(1)。 二十二、栈的压入、弹出序列 输入两...

thanatos_y
2016/07/22
1
0

没有更多内容

加载失败,请刷新页面

加载更多

面向对象设计原则(OOP)

单一职责原则(Single responsibility principle)又称单一功能原则。它规定一个类应该只有一个发生变化的原因。 核心原则:低耦合,高内聚。 一个类,应该只有一个引起它变化的原因,也就是...

gackey
27分钟前
2
0
C++ 锁

C++提供了两种常用的锁,std::lock_guard<Lockable &T>和std::unique_lock<Lockable &T>。通常使用场景下,这两个锁用法一致。即,在构造锁对象时上锁,在析构锁对象时解锁。使用户从上锁/解...

yepanl
30分钟前
2
0
Kali Linux Docker 練習

docker pull kalilinux/kali-linux-docker docker run -t -i kalilinux/kali-linux-docker /bin/bash apt-get update apt-get install htop apt-get install nmap apt-get install wpscan ap......

BaiyuanLab
今天
2
0
通俗大白话来理解TCP协议的三次握手和四次分手

最近在恶补计算机网络方面的知识,之前对于TCP的三次握手和四次分手也是模模糊糊,对于其中的细节更是浑然不知,最近看了很多这方面的知识,也在系统的学习计算机网络,加深自己的CS功底,就...

onedotdot
今天
2
0
TiDB 在爱奇艺的应用及实践

爱奇艺,中国高品质视频娱乐服务提供者,2010 年 4 月 22 日正式上线,推崇品质、青春、时尚的品牌内涵如今已深入人心,网罗了全球广大的年轻用户群体,积极推动产品、技术、内容、营销等全方...

TiDB
今天
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部