栈的概念和基本操作

概念及结构

  • 栈:是一种特殊的线性表,其只允许在固定的一端进行插入和删除元素的操作。进行数据插入和删除操作的一端称为栈顶,另一端为栈底

  • 栈中的数据元素遵守后进先出原则

  • 压栈:栈的插入操作称为进栈/压栈/入栈,其位置在栈顶

  • 出栈:栈的删除操作称为出栈,其位置也在栈顶

栈的概念和基本操作_第1张图片


实现方式

数组栈(推荐方式)

链式栈:相较数组栈无优势,且一般将链表尾作为栈底,链表头作为栈顶(单链表情况下)

定义

以数组栈为例

typedef int STElemType;
typedef struct Stack
{
	STElemType *data;
	int top;
	int capacity;
}ST;

接口函数

void StackInit(ST * ps);		//初始化
void StackDestroy(ST ps);		//销毁
void StackPush(ST *ps,STElemType x);	//入栈
void StackPop(ST *ps);		//出栈
STElemType StackTop(ST *ps);	//返回栈顶元素
int StackSize(ST *ps);	//返回栈的元素个数 
bool StackEmpty(ST *ps);	//判断栈是否为空(需要头文件 stdbool.h)

初始化

void StackInit(ST *pt)
{
	pt->data=(SElemType *)malloc(N*sizeof(SElemType));
   	if(!pt->data)
   	{
   		printf("ERROR!!");
   		exit(0);
	}
	pt->capacity=N;
	pt->top=0;	//此时top指向的是栈顶元素的下一个位置,也可以定义为pt->top=-1,这样,top就是指向栈顶元素
} 

销毁

void StackDestroy(ST *pt)
{
	free(pt->data);
	pt->top=pt->capacity=0;
} 

判断栈是否为空

bool StackEmpty(ST *pt)
{
	return pt->top==0; 	//若为真即栈为空,则返回1,否则返回0
} 

入栈

void StackPush(ST *pt,SElemType x)
{
	if(pt->top==pt->capacity)			//如果容量已满
	{
		pt->capacity=pt->capacity==0?N:pt->capacity*2;		//将容量扩为原来的两倍
		pt->data=realloc(pt->data,pt->capacity*sizeof(SElemType));
		if(!pt->data)
		{
			printf("ERROR!!");
			exit(0);
		}
	}
	pt->data[pt->top]=x;
	pt->top++;
}

出栈

void StackPop(ST *pt) 
{
	if(StackEmpty(pt))	//如果栈为空
	{
		printf("没有数据!!\n");
		exit(0);
	}
	pt->top--;
}

返回栈顶元素

SElemType StackTop(ST *pt)
{
	if(StackEmpty(pt))		//如果栈为空
	{
		printf("没有数据!!\n");
		exit(0);
	}
	return pt->data[pt->top-1]; 
} 

返回栈的元素个数

int StackSize(ST *pt)
{
	return pt->top;
} 

将栈的元素全部取出

void StackPrint(ST *pt)
{
	if(StackEmpty(pt))
	{
		printf("没有数据!!\n");
		exit(0);
	}
	while(!StackEmpty(pt))
	{
		printf("%d ",StackTop(pt));	//遵循先入后出原则,从上往下取
		pt->top--;
	}
} 

你可能感兴趣的:(数据结构与算法,数据结构,c语言)