首页 > 代码库 > 一步一步学习数据结构(三)栈的顺序存储结构实现代码

一步一步学习数据结构(三)栈的顺序存储结构实现代码

//栈这种逻辑结构的实现与一般线性表的实现类似,有两种存储方式:顺序存储和链式存储
//先学习顺序存储
//1、
#include<stdio.h>
#include<stdlib.h>
#define null NULL
#define SIZE 100
typedef int dataType ;
typedef struct
{
	dataType data[SIZE];
	int top;
}cStack,*cStackPointer;




//初始化栈空间
void 
initStack(cStackPointer *A);


//销毁栈空间
void 
destroyStack(cStackPointer *A);


//判断栈是否为空
int 
isEmpty(cStackPointer A);




//入栈,e是需要入栈的元素
int
pushStack(cStackPointer A,dataType e);




//出栈,e指向了出栈的元素
int 
popStack(cStackPointer A,dataType *e);






//查询top栈顶元素,e指向查询的结果元素,这个函数跟出栈函数的区别就是,查询只是查询,实际并没有出栈!
int 
getTopElement(cStackPointer A,dataType *e);




//列出如果栈内元素全部出栈的出栈顺序
void
displayPop(cStackPointer A);


int 
main()
{
	//声明指针栈变量
	cStackPointer A ;
	int i;
	printf("hello world !\n\n\n");
	
	//初始化栈A
	initStack(&A);


	//入栈
	for(i=0;i<=10;i++)
	pushStack(A,i);


	//打印全部元素的出栈顺序,只是打印,并没有真正出栈
	displayPop(A);




	//出栈操作
	popStack(A,&i);


	putchar(‘\n‘);


	//打印全部元素的出栈顺序,只是打印,并没有真正出栈
	displayPop(A);




	printf("\n\n任意键结束程序\n\n");
	getchar();
	return 0;


}


void 
initStack(cStackPointer *A)
{
	if(    ((*A) =(cStackPointer)malloc(sizeof(cStack))) ==null   )
		printf("内存不足!\n");
	else
	{
		printf("初始化栈成功!\n");
		(*A)->top = -1;
	}


}


void 
destroyStack(cStackPointer *A)
{


	if(*A==null)
	{
		printf("栈不存在,销毁失败!\n");
		return ;
	}
	else
	{
		free(*A);
		*A = null;
	}


}


int 
isEmpty(cStackPointer A)
{
	if(A->top==-1)
		return 1;
	else 
		return 0;
}




int
pushStack(cStackPointer A,dataType e)
{
	if(A->top==SIZE-1)
	{
		printf("栈已经满了,入栈失败!\n");
		return -1;
	}
	else 
	{
		A->top++;
		A->data[A->top]=e;
		return 0;
	}
}


int 
popStack(cStackPointer A,dataType *e)
{
	if(A->top==-1)
	{
		printf("栈是空的,出栈失败!\n");
		return -1;
	}
	else
	{
	


		//这一步的意思是,把出栈的元素保存起来,如果需要的话,就可使用它
		*e = 	A->data[A->top];


		A->top--;
		
		return 0;
	}


}


int 
getTopElement(cStackPointer A,dataType *e)
{
	if(A->top==-1)
	{
		printf("栈是空的,取top元素失败!\n");
		return -1;
	}
	else
	{
		
		//A->top--;//由于是查询操作,所以不用出栈!
		*e = A->data[A->top];
		return 0;
	}


}








void
displayPop(cStackPointer A)
{
	if(A->top==-1)
	{
		printf("栈是空的,输出栈为空!\n");
		return ;
	}
	else
	{
		int i;
		for(i=A->top;i>=0;i--)
		{
		


			printf("%d",A->data[i]);
				if(i==0)
					break;
				else printf("->");
		}
	}


	
		
}