使用数组结构实现大小固定的队列和栈
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;
}