您的位置:首页 > 编程语言 > C语言/C++

C++实现栈和队列

2018-03-15 15:56 369 查看
#include<iostream>
using namespace std;
void *memcpy(void *dest,void *src,int n)
{
char *pdest=(char*)dest;
char *psrc=(char*)src;
if(psrc+n>pdest)
{
for(int i=n-1;i>=0;i--)
pdest[i]=psrc[i];
}
else
{
for(int i=0;i<n;i++)
pdest[i]=psrc[i];
}
}
//栈的实现
template<typename T>
class stack{
public:
stack(int i);
~stack();
bool empty();
bool full();
void push(const T &obj);
void pop();
T top();
private:
int M;
int t;
T *data;
};
template<typename T>
stack<T>::stack(int i=1):M(i)
{
t=-1;
data=new T[M];
}
template<typename T>
stack<T>::~stack()
{
delete[]data;
}
template<typename T>
bool stack<T>::empty()
{
return t==-1;
}
template<typename T>
bool stack<T>::full()
{
return t==M-1;
}
template<typename T>
void stack<T>::push(const T &obj)
{
if(full())
{
T *buf=new T[2*M];
memcpy((char*)buf,(char*)data,sizeof(T)*M);

T *tmp=buf;
buf=data;
data=tmp;
delete[]buf;
M*=2;
}
data[++t]=obj;
}
template<typename T>
void stack<T>::pop()
{
if(empty())
return;
t--;
}
template<typename T>
T stack<T>::top()
{
if(empty())
return T();
return data[t];
}
//队列的实现
template<typename T>
class queue
{
public:
queue(int i);
~queue();
bool full();
bool empty();
void push(const T &obj);
T front();
void pop();
private:
int M;
int f,r;
T *data;
};
template<typename T>
queue<T>::queue(int i=1):M(i)
{
f=r=0;
data=new T[M];
}
template<typename T>
queue<T>::~queue()
{
delete[]data;
}
template<typename T>
bool queue<T>::full()
{
return (r+1)%M==f;
}
template<typename T>
bool queue<T>::empty()
{
return f==r;
}
template<typename T>
void queue<T>::push(const T &obj)
{
if(full())
{
T *buf=new T[2*M];

if(f==0)
memcpy(buf,data,M*sizeof(T));
else
{
memcpy(buf,&data[f],(M-f)*sizeof(T));
memcpy(&buf[M-f],data,r*sizeof(T));
f=0;
r=M;
}

T *tmp=buf;
buf=data;
data=tmp;
M*=2;
delete []buf;
}
data[r]=obj;
r=(r+1)%M;
}
template<typename T>
T queue<T>::front()
{
if(empty())
return T();
return data[f];
}
template<typename T>
void queue<T>::pop()
{
if(empty())
return;
f=(f+1)%M;
}
int main()
{
//测试栈
stack<int> st;
for(int i=0;i<10;i++)
st.push(i);
while(!st.empty())
{

cout<<st.top()<<' ';
st.pop();
}
cout<<endl;

//测试队列
queue<int> qu;
for(int i=0;i<5;i++)
qu.push(i);
cout<<qu.front()<<endl;
qu.pop();
cout<<qu.front()<<endl;
qu.pop();
for(int i=5;i<20;i++)
qu.push(i);
while(!qu.empty())
{
cout<<qu.front()<<' ';
qu.pop();
}
cout<<endl;

return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: