//实现栈
#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的时候才会重新又回到开始的位置。
实现一个特殊的栈,在实现栈的基本功能上,再实现返回栈中最小元素的操作。