数据结构复习--栈

栈的特色:后进先出,先进后出。

说明:本文仅做了最基本的栈结构和简单出入栈操作,理解栈的特点为首要目的。

一、栈结构的定义

#include <stdio.h>

/*栈的数据结构和出栈入栈*/ 
/*@author   Funky_天晴了*/ 
/*@date   2019.11.11 */ 
//定义出错常量
#define STACKFULL  0x01 
#define STACKEMPTY 0x02 
typedef int ElemType;
#define stacksize 10	//初始栈大小 
#define stacksizeadd 50 //栈空间大小增量 
//定义栈结构体
typedef struct
{
  ElemType *top; 		    //栈顶指针 
  ElemType *bottom;	            //栈底指针 
  ElemType stackspace[stacksize];   //栈存储空间 
}stack;

二、初始化以及出入栈函数

//栈初始化 
void initStack(stack &s)
{ 
	//栈顶指针指向栈空间头部
	s.top = s.stackspace;
	//栈底指针指向栈空间尾部 
	s.bottom = &s.stackspace[stacksize-1]; 
}

//预备函数 判断栈满和栈空
bool isStackFull(stack &s)
{
	if(s.top-1==s.bottom)
		return true;
	else
		return false;	
} 

bool isStackEmpty(stack &s)//判断top指针是否到达栈顶 
{
	if(s.top==s.stackspace)
		return true;
	else
	{
		return false;	
	}
}
//入栈
char push(ElemType data,stack &s)
{
	//栈满错误
	if(isStackFull(s))
		return STACKFULL;
	//正常入栈 在top位置存入数据,然后top“下移”
	*s.top++ = data;	 
	return 0;
} 

//出栈 出栈数据为data 
char pop(ElemType &data,stack &s)
{
	//栈空错误	
	if(isStackEmpty(s))
		return STACKEMPTY;
	else
	{
		//正常出栈 top先"上移",然后读取数据 
		data = *(--s.top);
		return 0;
	}		 
}

(注:判断栈满函数--bool isStackFull(stack &s)--以及栈判空函数虽然未对栈本身数据做改变,但也使用引用的原因在于,【若使用形参,则形参的栈顶指针、栈底指针以及栈顶的地址和使用时初始化的地址一般不对应】使用时保证地址对应。

例:若不用引用,则s.stackspace = 0x1234,是基于形参s的固定地址,调用时,s_new.stackspace = 0x5678,是基于初始化时系统给定的地址,若干个栈会有若干不同地址,是变化的。可见不使用引用,则对于不同的参数s,s.top不同,s.stackspace却同为0x1234,是不可取的。)  

三、调用及结果

int main(int argc, char *argv[])
{
	stack mystack;
	const char temparr[] = {9,8,7,6,5,4,3,2,1,0};
	char i = 0;
	ElemType popdata = -1;
	initStack(mystack);
	printf("正在入栈...\n");
	while(i<10)
	{
		if(push(temparr[i],mystack)==STACKFULL)
		{
			printf("栈满\n");
			break;
		}
		else
		{
			printf("%d\t",temparr[i]);
			i++;
		}
	}
	printf("\n");
	if(i==10)
	{
		printf("正在出栈...\n");
		for(i=0;i<10;i++)
		{
			if(pop(popdata,mystack)==STACKEMPTY)
			{
				printf("栈空:\n");
				break;
			}
			else
			{
				printf("%d\t",popdata);
			}
		}
		printf("\n");
	}
	if(pop(popdata,mystack)==STACKEMPTY)
	{
		printf("栈空:\n");
	}
	else 
	{
		printf("---%d---\n",popdata);	
	}
		
	return 0;
}

数据结构复习--栈