数据结构——栈和队列的表示与实现详解

本文详细介绍了栈和队列的基本概念、特点,以及它们在顺序和链式数据结构下的表示和操作实现,包括初始化、判断空、长度计算、入栈出栈、循环队列等,并探讨了递归的相关内容。
摘要由CSDN通过智能技术生成

目录

1.栈的定义与特点 

2.队列的定义与特点 

3.案例引入 

4.栈的表示和操作的实现 

1.顺序栈的表示 

代码示例:

2.顺序栈的初始化 

代码示例:

3.判断栈是否为空 

代码示例:

4.求顺序栈长度 

代码示例:

5.清空顺序栈 

代码示例:

6.销毁顺序栈 

代码示例:

7.顺序栈的入栈 

代码示例:

8.顺序栈的出栈 

代码示例:

5.链栈的表示和实现 

代码示例:

1.链栈的初始化 

代码示例:

2.判断链栈是否为空 

代码示例:

3.链栈的入栈 

代码示例:

4.链栈的出栈 

代码示例:

5.取栈顶元素 

代码示例:

6.栈与递归 

1.递归问题的求法 

2.递归的定义 

3.递归的优缺点 

7.队列的表示和操作 

1.队列的抽象数据类型定义 

2.队列的顺序表示和实现 

代码示例:

3.解决假上溢的办法——循环队列 

4.循环队列的类型定义 

代码示例:

5.队列的初始化 

代码示例:

6.求队列长度 

代码示例:

7循环队列入队 

代码示例:

8.循环队列出队 

代码示例:

9.取队头元素 

代码示例:

8.链队列

1.链队的类型定义 

代码示例:

2.链队初始化 

代码示例:

3.销毁链队列 

代码示例:

4.将元素e入队 

代码示例:

5.链队列出队 

代码示例:

6.求链队列的队头元素 

代码示例:

9.总的代码


1.栈的定义与特点 

874369c49c014acf9f6f9bad4369ef6c.png

313d5ec227264ce6b2093b4769a97be1.png

86ec6a93b6d94810972bf17404b6d16a.png

ab55bfce66d045ffaad646611229db8d.png

ca36895a430e4655a9d2073fe9ef4dc6.png

1cd453c687fa4a1e8c174afd8110ece4.png

8c4673c2fbe049f288bc7abb89058f51.png

2.队列的定义与特点 

705998c423464a2693638d425f3eebd9.png

03e851423fc74f8095fab42b91387942.png

3.案例引入 

2356252102f8455ca72aaff7e02a3528.png

4e85fee8d8384f3682449e603bc658eb.png

a3477b6d521846b5baa95dae8a0b25fa.png

7c77da222cfb49f4ba589fa8944a89e9.png

8d4a26ea0c2c428b827f299f81d6bf8c.png

15aa876b5e0d4474b13b429cd7194018.png

01d2c5b9d6ab4b6baac21d1cdfe14aa8.png

189901d3c73d447f9a53f1c465a58f46.png

ad586c8cfb944d26af135d7d0edbad73.png

4.栈的表示和操作的实现 

20ec2252eba24e75bc6b4ea05c15b230.png

1d077a5fa9b84b699a43e3ddb335fe2c.png

b0f78a91fe824e2db4db329fa5b99895.png

1b8e35151506471f98efe420d3393089.png

68d0c63c1a2f4035ba9a1053b6be667f.png

8923f58e6f7d49608d66d155e7f4a6a3.png

a5d96e3ad17c4c4e921b6e2e1d1bd80f.png

1.顺序栈的表示 

cedfde1b61c149259e742068b3581df4.png

代码示例:

#define maxsize 100;
typedef struct
{
	int *base;
	int *top;
	int stacksize;
}sqstack;

 

77cd34dee44c469bbcf2ddef46737490.png

2.顺序栈的初始化 

efd3b242780f4aa28129196bf73a4e92.png

代码示例:

int initstack(sqstack &s)
{
	s.base = new int[100];
	s.top = s.base;
	s.stacksize = 100;
	return 1;
}

3.判断栈是否为空 

f2717311403f4aa7a9b1ff8deba49e13.png

代码示例:

int stackempty(sqstack &s)
{
	if(s.top == s.base) return true;
	else return false;
}

4.求顺序栈长度 

0a9a0c8b6d92421ca17e0953646a3e89.png

代码示例:

int stacklength(sqstack &s)
{
	return s.top - s.base;
}

5.清空顺序栈 

f1bf4873fa0d482ea9b0e828bbb2fdb2.png

代码示例:

int clearstack(sqstack &s)
{
	if(s.base != NULL) s.top = s.base;
	return 1;
}

6.销毁顺序栈 

3b404cc107884b39acac57654cbd4c09.png

代码示例:

int destorystack(sqstack &s)
{
	if(s.base != NULL)
	{
		delete s.base;
		s.stacksize = 0;
		s.base = s.top = NULL;
	}
	return 1;
}

7.顺序栈的入栈 

f9e8b2adb3244368a5e0aeec0b229134.png

代码示例:

int push(sqstack &s,int e)
{
	if(s.top - s.base == s.stacksize)
		return 0;
	*s.top = e;
	s.top++;
	return 1;
}

8.顺序栈的出栈 

b375fe65d1d8472eb5e4044ffa908ad5.png

代码示例:

int pop(sqstack &s,int &e)
{
	if(s.top == s.base) return 0;
	s.top--;
	e = *s.top;
	return 1;
}

5.链栈的表示和实现 

31d5d8ccfec84600863598453863006f.png

代码示例:

typedef struct stacknode
{
	int data;
	struct stacknode *next;
}stacknode,*linkstack;
linkstack s;

1.链栈的初始化 

bd9fe269c5904e2d938717b2b7689269.png

代码示例:

void initlinkstack(linkstack &s)
{
	s = NULL;
}

2.判断链栈是否为空 

4ded6a84817a4d688c2f4d5329f5e6e2.png

代码示例:

int stackempty(linkstack s)
{
	if(s == NULL) return false;
	else return true;
}

3.链栈的入栈 

2302d1fb3fc042d6b476456c8c5d0368.png

代码示例:

int push(linkstack &s,int e)
{
	stacknode *p;
	p = new stacknode;
	p -> data = e;
	p -> next = s;
	s = p;
	return 1;
}

4.链栈的出栈 

6018b64aa96d43b3a2a97b312d8c5773.png

代码示例:

int pop(linkstack &s,int &e)
{
	if(s == NULL) return 0;
	e = s -> data;
	stacknode *p;
	p = s;
	s = s -> next;
	delete p;
	return 1;
}

5.取栈顶元素 

3d130ac01bcb4c3583a45d7819eba3b6.png

代码示例:

int gettop(stacknode *s)
{
	if(s != NULL) return s -> data;
}

6.栈与递归 

8a7b27fc5515481481d97928c0c01f6c.png

4d81056e4fc34888ae9fe6579d1ddc71.png

40f900bbeb854b7da4e79c71de3bba13.png

189d44c42300431985f4861876bc6a09.png

207ffae311164868969efc67fea9d8cd.png

1.递归问题的求法 

271db5da6fdf4e298d3ae4650c836ca5.png

2.递归的定义 

14f3f92deda545cfa0b4ce7b6f884563.png

329669cd8029431e85b0131a1fbf7ce7.png

b072c77b854b424387b251699124b282.png

f78140218ac24fb880d6cafe16fae1ef.png

b8d0ff5de92049fd81e92c1997e119b4.png

56b9b319b8ce48e8aceb772ac927fbf4.png

86fa5f386517491aac69afdb76ae5340.png

3.递归的优缺点 

46d1e9ea2f654d8d94ab777bcd816da2.png

dd111a9e33d94c52b69fe72e89e93bd0.png

48d82c2910904314bf79cbb9e9d50910.png

cd9b120082194947b8ea5038042e9ff6.png

486e4cfbd1ce4a4a916b18902c1bcb7e.png

9188e283cb8641e090ea16242ff801db.png

8611065aa5554c95aa017c5bed39fb49.png

7.队列的表示和操作 

ff68151fc2c045558ac382e9db4194b1.png

651d11520722463e900f9f0b87c631d5.png

67dc1d06a3d64287b8d6b30ee83a2c38.png

a71a5f32fcb64f33a34331d90ab1eb5f.png

1.队列的抽象数据类型定义 

bab86cc1bc2b4fbdb5d8e03210c4f685.png

2.队列的顺序表示和实现 

c5b3de9788c04e31b19033bd35d36b3e.png

代码示例:

#define maxqsize = 100
typedef struct
{
	int *base;
	int front;
	int rear;
}sqqueue;

 

1f0bc88402484f58af5c8571f2108c2d.png

5585b22f3f904d08b782025b09aa86b9.png

3.解决假上溢的办法——循环队列 

fdd83e86f1c74f59b15e024942afffd8.png

dd796b2bace4450d8d24e98c3060db72.png

e79d6071247c4b5892dee7a3b9b5c813.png

b1d4200ed0e244dd99430089bb6c9367.png

320ded398d574e208cd315feb692f60c.png

4.循环队列的类型定义 

07e709266c5443b9a9a4b7158f004402.png

代码示例:

#define maxqsize = 100
typedef struct
{
	int *base;
	int front;
	int rear;
}sqqueue;

5.队列的初始化 

6470440569f14618931c8fe0ac92119d.png

代码示例:

int initqueue(sqqueue &q)
{
	q.base = new int[100];
	q.front = q.rear = 0;
	return 1;
}

6.求队列长度 

18dd178cff3b480a85c0f1a4d9b62cab.png

代码示例:

int queuelength(sqqueue &q)
{
	return ((q.rear - q.front + maxqsize) % maxqsize);
}

7循环队列入队 

b6fe21e9af5a41bf977509fae30abd35.png

代码示例:

int enqueue(sqqueue &q,int e)
{
	if((q.rear + 1) % maxqsize == q.front) return 0;
	q.base[q.rear] = e;
	q.rear = (q.rear + 1) % maxqsize;
	return 1;
}

8.循环队列出队 

c31f2b07fe3e467a96593cd72b8b5578.png

代码示例:

int dequeue(sqqueue &q,int &e)
{
	if(q.front == q.rear) return 0;
	e = q.base[q.front];
	q.front = (q.front + 1) % maxqsize;
	return 1;
}

9.取队头元素 

f1881dc69d964d409bf81f9a49c85c0b.png

代码示例:

int gethead(sqqueue &q)
{
	if(q.front != q.rear)
		return q.base[q.front];
}

8.链队列

1.链队的类型定义 

22977415d11e4d5890d4f0bb8a92ade1.png

代码示例:

typedef struct qnode
{
	int data;
	struct qnode *next;
}qnode,*queueptr;

typedef struct
{
	queueptr front;
	queueptr rear;
}linkqueue;

 

6169096bb4774be4924a1027d88802ab.png

2.链队初始化 

51eb86cc622e40d49bfc5aeae02a1963.png

代码示例:

int lnitqueue(linkqueue &q)
{
	q.front = q.rear = new qnode;
	q.front -> next = NULL;
	return 1;
}

3.销毁链队列 

10d31302fe5f4aab8d87e8582cfbf135.png

fceb5c7b88024f35b6ee295f0a03e619.png

代码示例:

int destoryqueue(linkqueue &q)
{
	while(q.front)
	{
		queueptr p;
		p = q.front -> next;
		delete q.front;
		q.front = p;
	}
	return 1;
}

4.将元素e入队 

b03c7c480b4542f2a5da210c527b2c61.png

代码示例:

int enqueue(linkqueue &q,int e)
{
	queueptr p;
	p = new qnode;
	p -> data = e;
	p -> next = NULL;
	q.rear -> next = p;
	q.rear = p;
	return 1;
}

5.链队列出队 

54c0d965ac3e431881ba8d5bc613325f.png

b370f9433d38485f8200b538a519158b.png

32bff9d1f35741c8b23e294fbe850fcb.png

代码示例:

int dequeue(linkqueue &q,int &e)
{
	if(q.front == q.rear) return 0;
	queueptr p;
	p = q.front -> next;
	e = p -> data;
	q.front -> next = p -> next;
	if(q.rear == p) q.rear = q.front;
	delete p;
	return 1;
}

6.求链队列的队头元素 

5ac2582611254f6592eabb8e197ce530.png

代码示例:

int gethead(linkqueue q,int &e)
{
	if(q.front == q.rear) return 0;
	e = q.front -> next -> data;
	return 1;
}

9.总的代码

#include<bits/stdc++.h>
using namespace std;

#define maxsize 100;
typedef struct
{
	int *base;
	int *top;
	int stacksize;
}sqstack;

int initstack(sqstack &s)
{
	s.base = new int[100];
	s.top = s.base;
	s.stacksize = 100;
	return 1;
}

int stackempty(sqstack &s)
{
	if(s.top == s.base) return true;
	else return false;
}

int stacklength(sqstack &s)
{
	return s.top - s.base;
}

int clearstack(sqstack &s)
{
	if(s.base != NULL) s.top = s.base;
	return 1;
}

int destorystack(sqstack &s)
{
	if(s.base != NULL)
	{
		delete s.base;
		s.stacksize = 0;
		s.base = s.top = NULL;
	}
	return 1;
}

int push(sqstack &s,int e)
{
	if(s.top - s.base == s.stacksize)
		return 0;
	*s.top = e;
	s.top++;
	return 1;
}

int pop(sqstack &s,int &e)
{
	if(s.top == s.base) return 0;
	s.top--;
	e = *s.top;
	return 1;
}

typedef struct stacknode
{
	int data;
	struct stacknode *next;
}stacknode,*linkstack;
linkstack s;

void initlinkstack(linkstack &s)
{
	s = NULL;
}

int stackempty(linkstack s)
{
	if(s == NULL) return false;
	else return true;
}

int push(linkstack &s,int e)
{
	stacknode *p;
	p = new stacknode;
	p -> data = e;
	p -> next = s;
	s = p;
	return 1;
}

int pop(linkstack &s,int &e)
{
	if(s == NULL) return 0;
	e = s -> data;
	stacknode *p;
	p = s;
	s = s -> next;
	delete p;
	return 1;
}

int gettop(stacknode *s)
{
	if(s != NULL) return s -> data;
}

#define maxqsize = 100
typedef struct
{
	int *base;
	int front;
	int rear;
}sqqueue;

int initqueue(sqqueue &q)
{
	q.base = new int[100];
	q.front = q.rear = 0;
	return 1;
}

int queuelength(sqqueue &q)
{
	return ((q.rear - q.front + maxqsize) % maxqsize);
}

int enqueue(sqqueue &q,int e)
{
	if((q.rear + 1) % maxqsize == q.front) return 0;
	q.base[q.rear] = e;
	q.rear = (q.rear + 1) % maxqsize;
	return 1;
}

int dequeue(sqqueue &q,int &e)
{
	if(q.front == q.rear) return 0;
	e = q.base[q.front];
	q.front = (q.front + 1) % maxqsize;
	return 1;
}

int gethead(sqqueue &q)
{
	if(q.front != q.rear)
		return q.base[q.front];
}

typedef struct qnode
{
	int data;
	struct qnode *next;
}qnode,*queueptr;

typedef struct
{
	queueptr front;
	queueptr rear;
}linkqueue;

int lnitqueue(linkqueue &q)
{
	q.front = q.rear = new qnode;
	q.front -> next = NULL;
	return 1;
}

int destoryqueue(linkqueue &q)
{
	while(q.front)
	{
		queueptr p;
		p = q.front -> next;
		delete q.front;
		q.front = p;
	}
	return 1;
}

int enqueue(linkqueue &q,int e)
{
	queueptr p;
	p = new qnode;
	p -> data = e;
	p -> next = NULL;
	q.rear -> next = p;
	q.rear = p;
	return 1;
}

int dequeue(linkqueue &q,int &e)
{
	if(q.front == q.rear) return 0;
	queueptr p;
	p = q.front -> next;
	e = p -> data;
	q.front -> next = p -> next;
	if(q.rear == p) q.rear = q.front;
	delete p;
	return 1;
}

int gethead(linkqueue q,int &e)
{
	if(q.front == q.rear) return 0;
	e = q.front -> next -> data;
	return 1;
}

int main(){
	return 0;
}

  • 30
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

柏箱

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值