1. 程式人生 > 其它 >C語言實現棧及雙棧佇列

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

完事兒了。

本文來自部落格園,作者:拾荒荒,轉載請註明原文連結:https://www.cnblogs.com/lvvou/p/15694510.html