用数组实现栈和队列

本文详细介绍了栈和队列两种基本数据结构的实现方法,包括栈的添件、弹出、查看操作,以及队列的压入、弹出、查看功能。对比了两种不同的队列实现方式,一种是在数组的起始位置插入元素,另一种是采用双指针的方式,分别处理插入和弹出操作,后者在效率上更优。此外,还探讨了一种特殊栈的实现,即在保持栈基本功能的同时,能够返回栈中最小元素。
//实现栈
#include<iostream>
#include<string>
using namespace std;
class zhan
{
public:
 	zhan(int size)
	{
  		this->a = new int[size];
  		this->index = 0;
  		this->size =size;
 	}
 	int peek()             //查看
 	{
  		if (a == nullptr)
  		{
   			cout << "为空" << endl;
  			return 0;
  		}
  		else
   			return a[index - 1];
	}
 	void push(int num)     //添件
 	{
  		if (index == size )
  		{
   			cout << "已满!无法插入!!" << endl;
   			return;
  		}
  		this->a[index++] = num;
	 }
 	int pop()     //弹出
 	{
 	 	if (index == 0)
  		{
   			cout << "已空!无法弹出!!" << endl;
  			return 0;
  		}
  		return a[--index];
 	}
 	~zhan()
 	{
  		delete[]a;
 	}
private:
 	int *a = nullptr;
 	int index;
 	int size;
};
int main()
{
 	zhan p(4);
 	p.push(1);
 	p.push(2);
 	p.push(3);
 	p.push(4);
 	cout<<p.peek();
 	p.pop();
 	cout << p.peek();
 	p.pop();
 	cout << p.peek();
 	p.pop();
 	cout << p.peek();
 	p.pop();
 	p.pop();
 	p.pop();
 	return 0;
}
//实现队列
#include<iostream>
#include<string>
using namespace std;
class duilie
{
public:
 	duilie(int size)
 	{
  		this->a = new int[size];
  		this->index = 0;
  		this->size = size;
 	}
 	int peek()    //查看
 	{
  		if (index == 0)
  		{
   			cout << "已空" << endl;
 		 }
  		return a[index - 1];
 	}
 	void push(int num)    //压入队列
 	{
  		if (index == size)
  		{
   			cout << "已满" << endl;
   			return;
  		}
  		for (int i = index -1 ; i >= 0; --i)
  		{
   			a[i + 1] = a[i];
  		}
  		a[0] = num;
  		index++;
	 }
 	int pop()  //弹出
 	{
  		if (index == 0)
  		{
  			 cout << "已空,无法弹出" << endl;
   			return 0;
  		}
  		return a[--index];
	 }
private:
 	int * a;
 	int index;
 	int size;
};
int main()
{
 	duilie p(4);
 	p.push(1);
 	p.push(2);
 	p.push(3);
 	p.push(4);
 	p.push(5);
 	cout << p.peek();
 	p.pop();
 	cout << p.peek();
 	p.pop();
 	cout << p.peek();
 	p.pop();
 	cout << p.peek();
 	p.pop();
 	p.pop();
 	p.pop();
 	return 0;
 	return 0;
}

上面这个队列是我自己实现的,虽然功能和队列的功能一致但是却和队列的内部原理不一样。主要的差别是在压入元素的代码,我的写法是从0号位置插入第一个数,如果后续的数字再要插入就搬移队列里面的元素,全部往前搬一个位置,然后头部0号位置空出,再将要插入的数字插入到0号位置,而队列内部的实现类似于两个指针,一个负责插入一个负责弹出,我总结了一下,问我的写法不如人家的好,因为在插入元素的时候如果数字太多的话,就需要遍历整个数组,所以时间复杂度太高,下面实现队列真正的内部原理。

#include<iostream>
#include<string>
using namespace std;
class duilie
{
public:
 	duilie(int size)
	 {
 		 this->a= new  int[size];
  		this->start = 0;
  		this->size = 0;
  		this->end = 0;
  		this->length = size;
 	}
 	void push(int num)    //插入
	 {
  		if (size == length)
  		{
   			cout << "已满,无法插入" << endl;
   			return;
  		}
  		size++;
  		a[start] = num;
  		start = (start == length - 1) ? 0 : start + 1;
	 }
	 int pop()        //弹出
	 {
  		if (size == 0)
  		{
   			cout << "已空,无法弹出" << endl;
  		 	return 0;
 	 	}
  		size--;
  		int tmp = end;
  		end = (end == length) ? 0 : end + 1;
  		return a[tmp];
 	}
 	int peek()   //查看
	 {
		  if (size == 0)
  		{
   			cout << "已空,没有数字可以查看" << endl;
  			 return 0;
  		}
  		return a[end];
 	}
private:
 	int *a;    //数组
 	int size;   //数组的大小随着数字的插入变化的那种
 	int start;   //指向元素可以插入的位置
 	int end;   ///指向队列的最后一个位置,如果要弹出的话就是这个位置的数字弹出
 	int length;//用这个来记录传进来的长度
};
int main()
{
 	duilie p(4);
 	p.push(1);
 	p.push(2);
 	p.push(3);
 	p.push(4);
 	p.push(5);
 	cout << p.peek();
 	p.pop();
 	cout << p.peek();
 	p.pop();
 	cout << p.peek();
 	p.pop();
 	cout << p.peek();
 	p.pop();
 	p.pop();
 	p.pop();
 	return 0;
}

上面这段就是不是每次都往0位置插而是在整个数组上轮流插,插一个数end变换一下,假如先在0,1,2位置插入,然后再弹出0,1,2位置的数,然后下一次插入就是从3位置插入,只有end==length-1的时候才会重新又回到开始的位置。
实现一个特殊的栈,在实现栈的基本功能上,再实现返回栈中最小元素的操作。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值