c语言实现栈及双栈队列

目的

使用C语言实现一个栈。

使用2个栈实现队列效果

栈与队列

栈: 元素先进后出。
只有 1 个口子,所以只能先进后出

队列:元素先进先出。
有 2 个口子,所以可以先进先出

理解完后,
上代码。

实现一个栈

#include <stdlib.h>
#include <stdio.h>
#include <string>

#define STACK_SIZE 5       // 栈空间大小
#define ELEMENT_TYPE int

// 栈数据结构
typedef struct Stack {
	ELEMENT_TYPE _data[STACK_SIZE];
	int _top;

}StackList;

// 初始化栈
void init(StackList *stack)
{
	memset(stack->_data, 0, sizeof(ELEMENT_TYPE) * STACK_SIZE);
	stack->_top = 0;
}

// 栈是否为空
bool empty(StackList *stack)
{
	return stack->_top == 0;
}

// 栈是否为满
bool full(StackList *stack)
{
	return stack->_top > (STACK_SIZE-1);
}

// 入栈
bool push(StackList *stack, ELEMENT_TYPE data)
{
	if (full(stack)) {
		printf("错误:栈溢出\n");
		return false;
	}
	stack->_data[stack->_top++] = data;
	printf("入栈:%d\n", data);
	return true;
}

// 出栈
ELEMENT_TYPE pop(StackList *stack)
{
	if (empty(stack)) {
		printf("错误:栈为空\n");
		return (ELEMENT_TYPE)0;
	}

	ELEMENT_TYPE data = stack->_data[--stack->_top];
	printf("出栈%d\n", data);
	return data;
}

// 主函数
int main(int argc, char **argv)
{
	StackList stack_list;
	
	init(&stack_list);

	push(&stack_list, 1);
	push(&stack_list, 2);
	push(&stack_list, 3);
	push(&stack_list, 4);
	push(&stack_list, 5);
	push(&stack_list, 6);

	pop(&stack_list);
	pop(&stack_list);
	pop(&stack_list);
	pop(&stack_list);
	pop(&stack_list);
	pop(&stack_list);

	return 0;
}

调试结果:

实现 2 个栈的队列效果

#include <stdlib.h>
#include <stdio.h>
#include <string>

#define STACK_SIZE 5       // 栈空间大小
#define ELEMENT_TYPE int

// 栈数据结构
typedef struct Stack {
	ELEMENT_TYPE _data[STACK_SIZE];
	int _top;

}StackList;

// 初始化栈
void init(StackList *stack)
{
	memset(stack->_data, 0, sizeof(ELEMENT_TYPE) * STACK_SIZE);
	stack->_top = 0;
}

// 栈是否为空
bool empty(StackList *stack)
{
	return stack->_top == 0;
}

// 栈是否为满
bool full(StackList *stack)
{
	return stack->_top > (STACK_SIZE-1);
}

// 入栈
ELEMENT_TYPE push(StackList *stack, ELEMENT_TYPE data)
{
	if (full(stack)) {
		printf("错误:栈溢出\n");
		return -1;
	}
	stack->_data[stack->_top++] = data;
	//printf("入栈:%d\n", data);
	return data;
}

// 出栈
ELEMENT_TYPE pop(StackList *stack)
{
	if (empty(stack)) {
		printf("错误:栈为空\n");
		return -1;
	}

	ELEMENT_TYPE data = stack->_data[--stack->_top];
	//printf("出栈%d\n", data);
	return data;
}

// 主函数
int main(int argc, char **argv)
{
	StackList stack_list1, stack_list2;
	
	init(&stack_list1);
	init(&stack_list2);

	printf("stack_list1 入栈:%d\n", push(&stack_list1,1));
	printf("stack_list1 入栈:%d\n", push(&stack_list1,2));
	printf("stack_list1 入栈:%d\n", push(&stack_list1,3));

	push(&stack_list2, pop(&stack_list1));
	push(&stack_list2, pop(&stack_list1));
	push(&stack_list2 ,pop(&stack_list1));

	printf("\n----------我是分割线----------\n\n");

	printf("stack_list2 出栈:%d\n", pop(&stack_list2));
	printf("stack_list2 出栈:%d\n", pop(&stack_list2));
	printf("stack_list2 出栈:%d\n", pop(&stack_list2));

	return 0;
}

调试结果:

_End

完事儿了。

posted @ 2021-12-15 18:34  想想就很离谱  阅读(219)  评论(0编辑  收藏  举报