左神算法基础class3—题目1使用数组实现队列和栈

1.使用数组实现栈

(1) 分析

使用index变量指向数组的位置表示要把新来的数放在什么位置。
1.入栈时把数值赋给数组中index位置,之后index自增,在index !=length时可继续入栈。
2.出栈时输出当前数值,再index减一,index !=0时可继续入栈。出栈不需要删除当前的数,因为使用index来控制入栈和出栈,数据可以被覆盖掉。
3.栈中的元素不是数组内的所有元素,而是数组中index前的元素。

(2) 核心代码

①入栈

void push(int a,int arr[],int &index)
{
	if(index ==length)
	{
		cout<<"栈已满,不可入栈"<<endl;
		return;
	}
	cout<<a<<"入栈"<<endl;
	arr[index++] = a;
}

上式是直接把数据入栈,还可以输入数据入栈

void push(int arr[],int &index)
{
	if(index == length)
	{
		cout<<"栈已满,不可入栈"<<endl;
		return;
	}
		
	int num;
	cout<<"请输入:";
	cin>>num;
	cout<<num<<"入栈"<<endl;
	arr[index++] = num;
}

②出栈

void pop(int arr[],int &index)
{
	if(index == 0)
	{
		cout<<"栈已空,不可出栈"<<endl;
		return;
	}
	cout<<arr[--index]<<"出栈"<<endl;
}

(3) 完整代码

#include<iostream>
#include<time.h>
#define length  3
using namespace std;

void print(int arr[],int index)
{
	cout<<"栈内的元素: ";
	for(int i = 0;i<index;i++)
	{
		cout<<arr[i]<<" ";
	}
	cout<<endl;
}

void push(int arr[],int &index)
{
	if(index == length)
	{
		cout<<"栈已满,不可入栈"<<endl;
		return;
	}
		
	int num;
	cout<<"请输入:";
	cin>>num;
	cout<<num<<"入栈"<<endl;
	arr[index++] = num;
}

void push(int a,int arr[],int &index)
{
	if(index == length)
	{
		cout<<"栈已满,不可入栈"<<endl;
		return;
	}
	cout<<a<<"入栈"<<endl;
	arr[index++] = a;
}

void pop(int arr[],int &index)
{
	if(index == 0)
	{
		cout<<"栈已空,不可出栈"<<endl;
		return;
	}
	cout<<arr[--index]<<"出栈"<<endl;
}
int main()
{

	int arr[length]  ;

	int index = 0;
	push(arr,index);
	print(arr,index);
	push(6,arr,index);
	print(arr,index);
	pop(arr,index);
	print(arr,index);
	push(2,arr,index);
	print(arr,index);
	push(2,arr,index);
	print(arr,index);
	push(2,arr,index);
	print(arr,index);
	pop(arr,index);
	pop(arr,index);
	pop(arr,index);
	pop(arr,index);
	system("pause");
	return 0;
}

(4) 输出结果

在这里插入图片描述

2.使用数组实现队列

(1) 分析

1.定义end指针指向新加入的数在数组中要放的位置,一开始指向0,定义start指针指向需要拿取的数在数组中的位置,一开始也指向0,定义size用来记录队列的长度,刚开始置0;
2.当size<数组总长度时,可以添加数组,之后end加一,size加一,当size!=0时,可以拿取一个数字,start加一,size减一。
3.如果end指向数组末尾,但是size小于总长度时(之前释放过数),end置位0,可以继续添加数;同理,如果start到底,但是size!=0,也可继续释放,start置零。
※Tips:相当于循环数组的感觉,但是前提是size的条件必须满足。start与end相互独立,只与size有关。

(2) 核心代码

①添加数据

熟练使用三目运算符可以代替较为简单的if-else语句

void add_num(int arr[],int &end,int &size,int num)
{
	if(size == length)
	{
		cout<<"队列已满,不可添加!"<<endl;
		return;
	}
	
	arr[end] = num;
	size++;
	end = end == length - 1 ? 0 : end + 1;



	cout<<"入: "<<num<<endl;;

}

②释放数据

void sub_num(int arr[],int &start,int &size)
{
	if(size == 0)
	{
		cout<<"队列已空,不可出!"<<endl;
		return;
		
	}
	cout<<"出:"<<arr[start]<<endl;
	size--;
	start = start == length - 1 ? 0 : start+1;
}

③输出队列

void print(int arr[],int start,int size)
{
	if(size == 0)
	{
		cout<<"队列无元素"<<endl;
		return;
	}
		
	cout<<"队列为:";
	while(size != 0)
	{
		cout<<arr[start]<<" "; 
		start = start == length - 1 ? 0 : start+1;
		size--;

	}
	cout<<endl;
}

(3) 完整代码

#include<iostream>
#include<time.h>
#define length  3
using namespace std;

void print(int arr[],int start,int size)
{
	if(size == 0)
	{
		cout<<"队列无元素"<<endl;
		return;
	}
		
	cout<<"队列为:";
	while(size != 0)
	{
		cout<<arr[start]<<" "; 
		start = start == length - 1 ? 0 : start+1;
		size--;

	}
	cout<<endl;
}
void add_num(int arr[],int &end,int &size,int num)
{
	if(size == length)
	{
		cout<<"队列已满,不可添加!"<<endl;
		return;
	}
	
	arr[end] = num;
	size++;
	end = end == length - 1 ? 0 : end + 1;



	cout<<"入: "<<num<<endl;;

}

void sub_num(int arr[],int &start,int &size)
{
	if(size == 0)
	{
		cout<<"队列已空,不可出!"<<endl;
		return;
		
	}
	cout<<"出:"<<arr[start]<<endl;
	size--;
	start = start == length - 1 ? 0 : start+1;
}

int main()
{
	int arr[length];
	int size = 0;
	int end = 0;
	int start = 0;
	add_num(arr,end,size,6);
	print(arr,start,size);
	add_num(arr,end,size,3);
	print(arr,start,size);
	add_num(arr,end,size,4);
	print(arr,start,size);

	sub_num(arr,start,size);
	print(arr,start,size);

	add_num(arr,end,size,9);
	print(arr,start,size);
	add_num(arr,end,size,0);
	print(arr,start,size);

	sub_num(arr,start,size);
	print(arr,start,size);
	sub_num(arr,start,size);
	print(arr,start,size);
	sub_num(arr,start,size);
	print(arr,start,size);
	sub_num(arr,start,size);


	system("pause");
	return 0;
}

(4) 结果输出

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值