Bootstrap

【C语言】实现数据结构——栈,队列

栈和队列都常用的数据结构,这里使用C语言实现栈和队列,


一、栈

栈:是一种特殊的线性表,其只允许在一端出数据和入数据,插入数据和删除数据的一端加栈顶,另一端叫栈底。其数据遵守先进后出的原则(Last in First out)。 

因为这个特点那么如果进入一段数据是 1 2 3 4 5,那么其出数据就是反的 5 4 3 2 1。 

压栈(push):往栈顶插入数据。

出栈(pop):把数据在栈顶删除。

实现:


typedef int STdatatype;

typedef struct stack
{
	STdatatype *arr;
	int top;
	int capacity;

}stack;

//初始化
void StackInit(stack* ps);
//销毁堆栈
void StackDestory(stack* ps);
//压栈
void StackPush(stack* ps, STdatatype x);
//出栈
void StackPop(stack* ps);
//取栈顶的值
STdatatype StackTop(stack* ps);
//判断栈是否为空
bool StackIsEmpty(stack* ps);
//栈的长度
int StackSize(stack* ps);

void StackInit(stack* ps)
{
	assert(ps);
	ps->arr = NULL;
	ps->capacity = 0;
	ps->top = 0;

}

void StackDestory(stack* ps)
{
	assert(ps);

	free(ps->arr);
	ps->arr = NULL;
	ps->capacity = 0;
	ps->top = 0;
}

void StackPush(stack* ps, STdatatype x)
{
	assert(ps);

	if (ps->capacity == ps->top){
		int newCapacity  = ps->capacity == 0 ? 4 : ps->capacity * 2;
		STdatatype* p = (STdatatype*)realloc(ps->arr, sizeof(STdatatype)* newCapacity);
		if (p==NULL)
		{
			perror("申请内存失败\n");
			exit(0);
		}
		ps->capacity = newCapacity;
		ps->arr = p;
	}
	ps->arr[ps->top] = x;
	ps->top++;

}

void StackPop(stack* ps)
{
	assert(ps);
	assert(!StackIsEmpty(ps));
	ps->top--;
}

STdatatype StackTop(stack* ps)
{
	assert(ps);
	assert(!StackIsEmpty(ps));
	return ps->arr[ps->top-1];
}

bool StackIsEmpty(stack* ps)
{
	assert(ps);
	return ps->top == 0;
}

int StackSize(stack* ps)
{
	assert(ps);
	assert(!StackIsEmpty(ps));
	return ps->top;
}

这里使用了数组来模拟实现栈的特点。

测试:

PS:栈是不能被遍历的,要访问下一个数据,必须把现在的数据弹出栈顶。 

PS:但是,还是要注意,并不是遍历的时候,出数据就只能是5 4 3 2 1,如果这里一边访问一边出数据,数据还是顺序的。

举例:

二、队列

队列:只允许在一端进行插入数据操作,在另一端进行删除数据操作的特殊线性表,队列具有先进先出 (First In First Out)
入队列:进行插入操作的一端称为队尾。
出队列:进行删除操作的一端称为队头。

因为其只能在队头出数据,所以进入一段数据 1 2 3 4 5,那么出数据的顺序也该是 1 2 3 4 5。

实现:

typed
;