数据结构-顺序栈

时间:2024-10-21 18:05:20

栈:是一种特殊的线性表,其只允许在表尾进行插入和删除元素操作。进行数据插入和删除操作的一端称为栈顶,另一端称为栈底。栈中的数据元素遵守后进先出LIFO(Last In First Out)的原则。

压栈:栈的插入操作叫做进栈 / 压栈 / 入栈,入数据在栈顶。

出栈:栈的删除操作叫做出栈。出数据也在栈顶。

 

 顺序栈结构体定义

typedef struct
{
	int data[MAX_SIZE];//数组顺序栈
	int top;//栈顶指针
}seqstack_t;//顺序栈的结构体

顺序栈初始化

//顺序栈的初始化
seqstack_t* seqstack_init()
{
	seqstack_t* s = (seqstack_t*)malloc(sizeof(seqstack_t));//申请一块顺序栈大小的内存
	memset(s->data,0,sizeof(s->data));
	s->top = -1;//栈顶指针
	return s;
}

 判断栈是否已满

//判断栈是否已满
int stack_isfull(seqstack_t* s)
{
	return(s->top == MAX_SIZE - 1);//如果栈顶指针等于最大长度减一 那说明栈顶指针就到了最大的位置
}

判断栈是否已空

int stack_isempty(seqstack_t* s)
{
	return (s->top == -1);//当top等于-1时说明栈里面没有元素
}

入栈

//入栈
int stack_push(seqstack_t* s, int data)
{
	if (stack_isfull(s))
	{
		printf("栈已满\n");
		return -1;
	}
	s->top++;//栈顶指针加一
	s->data[s->top] = data;
	return 0;
}

出栈

//出栈
int stack_pop(seqstack_t* s)
{
	int value;
	if (stack_isempty(s))
	{
		printf("栈已空");
		return -1;
	}
	value = s->data[s->top];
	s->top--;
	return value;
}

测试

int main()
{
	seqstack_t* S = seqstack_init();
	printf("入栈");
	for (int i = 1; i < 5; i++)
	{
		printf("%d", i);
		stack_push(S,i);
	}
	printf("\n");
	printf("出栈");
	while (!stack_isempty(S))
	{
		int value = stack_pop(S);
		printf("%d", value);
	}
	return 0;
}