栈和队列的实现

栈的实现

1.结构的定义和一些基本函数的命名

使用typedef,使栈的数据类型具有多样性

typedef int stackdate;
typedef struct stack
{
	stackdate* p;
	int top;
	int cy;
}stack;
stack* stackinit();
void stackpush(stack* pc, stackdate x);
void stackdestroy(stack* pc);
void stackpop(stack* pc);
int stacksize(stack* pc);
bool stackempty(stack* pc);
stackdate stacktop(stack* pc);
2.函数的实现

栈与顺序表类似,大多数函数的实现和顺序表大致相同

stack* stackinit()
{
	stack* pc=(stack*)malloc(sizeof(stack));
	pc->p = NULL;
	pc->cy = 0;
	pc->top = 0;
	return pc;
}
void stackdestroy(stack* pc)
{
	assert(pc);;
	free(pc->p);
	pc->p = NULL;
	pc->cy = 0;
	pc->top = 0;
}
void stackpush(stack* pc, stackdate x)
{
	assert(pc);
	if (pc->top == pc->cy)
	{
		int newcy = pc->cy == 0 ? 4 : pc->cy * 2;
		stackdate* temp = (stackdate*)realloc(pc->p, sizeof(stackdate) * newcy);
		if (temp == NULL)
		{
			perror("stackpush");
			exit(-1);
		}
		pc->p = temp;
		pc->cy = newcy;
	}
	pc->p[pc->top] = x;
	pc->top++;
}
void stackpop(stack* pc)
{
	assert(pc);
	assert(pc->top);
	pc->top--;
}
int stacksize(stack* pc)
{
	assert(pc);
	return pc->top;
}
bool stackempty(stack* pc)
{
	assert(pc);
	return pc->top == 0;
}
stackdate stacktop(stack* pc)
{
	assert(pc);
	assert(pc->top);
	return pc->p[pc->top - 1];
}

队列的实现

1.结构的定义和一些基本函数的命名

使用typedef,使队列的数据类型具有多样性

在定义一个结构体进行结构体的嵌套,利用第二个结构体去实现和维护queue的功能

typedef int queuedate;
typedef struct queuenode
{
	struct queuenode* next;
	queuedate date;
}queuenode;
typedef struct que
{
	queuenode* head;
	queuenode* tail;
	int size;
}que;
void queueinit(que* pc);
void queuedestroy(que* pc);
void queuepushback(que* pc, queuedate x);
void queuepop(que* pc);
bool queueempty(que* pc);
queuedate queuefront(que* pc);
queuedate queueback(que* pc);
int queuesize(que* pc);
2.函数的实现

使用链表的结构去实现

void queueinit(que* pc)
{
	assert(pc);
	pc->head = pc->tail = NULL;
	pc->size = 0;
}
void queuepushback(que* pc, queuedate x)
{
	assert(pc);
	queuenode* newnode = (queuenode*)malloc(sizeof(queuenode));
	if (newnode == NULL)
	{
		perror("queeupushback");
		exit(-1);
     }
	newnode->date = x;
	newnode->next = NULL;
	if (pc->tail == NULL)
		pc->head = pc->tail = newnode;
	else
	{
		pc->tail->next = newnode;
		pc->tail = newnode;
	}
	pc->size++;
}
bool queueempty(que* pc)
{
	return pc->size == 0;
}
void queuepop(que* pc)
{
	assert(pc);
	assert(!queueempty(pc));
	queuenode* next = pc->head->next;
	if (next == NULL)
	{
		pc->head = pc->tail = NULL;
		
     }
	else {
		free(pc->head);
		pc->head = next;
	}
	pc->size--;
}
queuedate queuefront(que* pc)
{
	assert(pc);
	assert(!queueempty(pc));
	return pc->head->date;
}
queuedate queueback(que* pc)
{
	assert(pc);
	assert(!queueempty(pc));
	return pc->tail->date;
}
int queuesize(que* pc)
{
	assert(pc);
	return pc->size;
}
void queuedestroy(que* pc)
{
	assert(pc);
	queuenode* cur = pc->head;
	while (cur)
	{
		queuenode* next = cur->next;
		free(cur);
		cur = next;
	}
	pc->head = pc->tail = NULL;
	pc->size = 0;
}

总结

栈和队列都可以用顺序表和链表实现,但大多数来说,栈一般用顺序表,队列用链表去实现,

牢记栈先进后出,队列先进先出

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值