学习笔记-数据结构与算法之栈与队列

本文详细介绍了栈(LIFO)和队列(FIFO)的数据结构,包括顺序存储(如循环队列)和链式存储的实现方法,以及它们在主函数中的应用实例。通过代码展示,读者将理解如何初始化、入栈/出栈、入队/出队,以及解决循环队列的假溢出问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

栈 LIFO

顺序存储

typedef int elemtype;
typedef struct stack{
	elemtype *base,*top;
}stack;

初始化

void init_stack(stack& sqstack){
	sqstack.base = new elemtype[maxsize];
	if(!sqstack.base) exit(OVERFLOW);
	sqstack.top=sqstack.base;
}

入栈

void push(stack& sqstack,elemtype e){
	if(sqstack.top-sqstack.base == maxsize) return ;
	*sqstack.top = e;
	sqstack.top++;
}

出栈

void pop(stack& sqstack,elemtype *e){
	if(sqstack.top == sqstack.base) return;
	*e = *(--sqstack.top);
}

整体代码

#include<iostream>
using namespace std;
#include<stdlib.h>
#include<math.h>
	
#define maxsize 20
typedef int elemtype;
typedef struct stack{
	elemtype *base,*top;
}stack;

void init_stack(stack& sqstack);
void push(stack& sqstack,elemtype e);
void pop(stack& sqstack,elemtype *e);
int main(){
	stack sqstack;
	init_stack(sqstack);
	push(sqstack,56);
	push(sqstack,32);
	elemtype e;
	pop(sqstack,&e);
	cout<<e<<endl;
	pop(sqstack,&e);
	cout<<e<<endl;;
	return 0;
}
void init_stack(stack& sqstack){
	sqstack.base = new elemtype[maxsize];
	if(!sqstack.base) exit(OVERFLOW);
	sqstack.top=sqstack.base;
}
void push(stack& sqstack,elemtype e){
	if(sqstack.top-sqstack.base == maxsize) return ;
	*sqstack.top = e;
	sqstack.top++;
}
void pop(stack& sqstack,elemtype *e){
	if(sqstack.top == sqstack.base) return;
	*e = *(--sqstack.top);
}

链式存储

typedef int elemtype;
typedef struct node{
	elemtype data;
	struct node *next; 
}node,*link_node;

typedef struct Stack{
	link_node top;
	int length;
}Stack;

入栈

void push(Stack &stack,elemtype e){ // 头插 - 逆序
	link_node p = new node;
	p->data = e;
	p->next = stack.top;
	stack.top = p;
	stack.length ++;
}

出栈

void pop(Stack &stack,elemtype *e){
	if(stack.top == NULL) return;
	link_node p=stack.top;
	stack.top = p->next;
	*e = p->data;
	delete p;
	stack.length--;
}

整体代码

#include<iostream>
using namespace std;

typedef int elemtype;
typedef struct node{
	elemtype data;
	struct node *next; 
}node,*link_node;

typedef struct Stack{
	link_node top;
	int length;
}Stack;

void push(Stack &stack,elemtype e);
void pop(Stack &stack,elemtype *e);
int main(){
	Stack stack;
	stack.top = NULL;
	stack.length = 0;
	push(stack,12);
	push(stack,10);
	elemtype e;
	pop(stack,&e);
	cout<<e<<endl;
	pop(stack,&e);
	cout<<e<<endl;
	return 0;
}
void push(Stack &stack,elemtype e){ // 头插 - 逆序
	link_node p = new node;
	p->data = e;
	p->next = stack.top;
	stack.top = p;
	stack.length ++;
}
void pop(Stack &stack,elemtype *e){
	if(stack.top == NULL) return;
	link_node p=stack.top;
	stack.top = p->next;
	*e = p->data;
	delete p;
	stack.length--;
}

队列 FIFO

顺序结构 – 循环队列(解决假溢出)

typedef int elemtype;
typedef struct queue{
	elemtype data[maxsize];
	int head,tail;
	int length;
} Squeue;

初始化

void init_queue(Squeue &queue){
	queue.head=queue.tail=0;
	queue.length = 0;
}

入队

void en_queue(Squeue &queue,elemtype e){
	if(queue.length == maxsize) return;
	queue.data[queue.tail] = e;
	queue.tail = (queue.tail+1)%maxsize; // 注意点
	queue.length=(queue.tail-queue.head+maxsize)%maxsize;
}

出队

void de_queue(Squeue &queue,elemtype *e){
	if(queue.length == 0) return ;
	*e = queue.data[queue.head];
	queue.head = (queue.head+1)%maxsize;// 注意点
	queue.length=(queue.tail-queue.head+maxsize)%maxsize;
}

整体代码

#include<iostream>
using namespace std;

#define maxsize 4
typedef int elemtype;
typedef struct queue{
	elemtype data[maxsize];
	int head,tail;
	int length;
} Squeue;

void init_queue(Squeue &queue);
void en_queue(Squeue &queue,elemtype e);
void de_queue(Squeue &queue,elemtype *e);

int main(){
	Squeue queue;
	init_queue(queue);
	en_queue(queue,10);
	en_queue(queue,11);
	en_queue(queue,12);
	elemtype e;
	de_queue(queue,&e);
	cout<<e<<endl;
	de_queue(queue,&e);
	cout<<e<<endl;
	en_queue(queue,13);
	en_queue(queue,14);
	de_queue(queue,&e);
	cout<<e<<endl;
	de_queue(queue,&e);
	cout<<e<<endl;
	de_queue(queue,&e);
	cout<<e<<endl;
	return 0;
}
void init_queue(Squeue &queue){
	queue.head=queue.tail=0;
	queue.length = 0;
}
void en_queue(Squeue &queue,elemtype e){
	if(queue.length == maxsize) return;
	queue.data[queue.tail] = e;
	queue.tail = (queue.tail+1)%maxsize; // 注意点
	queue.length=(queue.tail-queue.head+maxsize)%maxsize;
}
void de_queue(Squeue &queue,elemtype *e){
	if(queue.length == 0) return ;
	*e = queue.data[queue.head];
	queue.head = (queue.head+1)%maxsize;// 注意点
	queue.length=(queue.tail-queue.head+maxsize)%maxsize;
}

链式存储

typedef int elemtype;
typedef struct node{
	elemtype data;
	struct node *next;
}node,*link_node;
typedef struct queue{
	node head;
	link_node tail;
}Queue;

初始化

void init_queue(Queue &queue){
	queue.head.data=0;
	queue.head.next = NULL;
	queue.tail=	&queue.head;
}

入队

void en_queue(Queue &queue,elemtype e){
	link_node p;
	p = new node;
	if(!p) exit(OVERFLOW);
	p->data = e;
	p->next = NULL;
	queue.tail->next= p;
	queue.tail = p;
	queue.head.data++;
}

出队

void de_queue(Queue &queue,elemtype *e){
	if(queue.head.data == 0) return ;
	link_node p=queue.head.next;
	*e=p->data;
	queue.head.next = p->next;
	delete p;
	queue.head.data--;
	if(queue.head.data == 0) queue.tail = &queue.head ; // 注意点
}

整体代码

#include<iostream>
using namespace std;
#include<math.h>
#include<stdlib.h>

typedef int elemtype;
typedef struct node{
	elemtype data;
	struct node *next;
}node,*link_node;
typedef struct queue{
	node head;
	link_node tail;
}Queue;

void init_queue(Queue &queue);
void en_queue(Queue &queue,elemtype e);
void de_queue(Queue &queue,elemtype *e);
int main(){
	Queue queue;
	init_queue(queue);
	en_queue(queue,10);
	en_queue(queue,11);
	en_queue(queue,12);
	
	elemtype e;
	de_queue(queue,&e);
	cout<<e<<'d'<<queue.head.data<<endl;
	de_queue(queue,&e);
	cout<<e<<'d'<<queue.head.data<<endl;
	de_queue(queue,&e);
	cout<<e<<'d'<<queue.head.data<<endl;
	en_queue(queue,13);
	de_queue(queue,&e);
	cout<<e<<'d'<<queue.head.data<<endl;
	return 0;
}

void init_queue(Queue &queue){
	queue.head.data=0;
	queue.head.next = NULL;
	queue.tail=	&queue.head;
}
void en_queue(Queue &queue,elemtype e){
	link_node p;
	p = new node;
	if(!p) exit(OVERFLOW);
	p->data = e;
	p->next = NULL;
	queue.tail->next= p;
	queue.tail = p;
	queue.head.data++;
}
void de_queue(Queue &queue,elemtype *e){
	if(queue.head.data == 0) return ;
	link_node p=queue.head.next;
	*e=p->data;
	queue.head.next = p->next;
	delete p;
	queue.head.data--;
	if(queue.head.data == 0) queue.tail = &queue.head ; // 注意点
}

传送门

if (!S.base)exit(OVERFLOW)是什么意思
深入掌握栈的三种类型初始化

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值