实现特殊的栈和队列
Posted gcheeze
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了实现特殊的栈和队列相关的知识,希望对你有一定的参考价值。
利用一个固定数组实现栈和队列
class ArrayStack //用数组实现栈
public:
ArrayStack(int initsize) //创建一个固定长度的数组
if (initsize < 0)
cout << "数组长度小于0" << endl;
else
array = vector<int>(initsize - 1);
size = 0;
void push(int obj)
if (size == array.size())
cout << "栈已满" << endl;
else
array[size++] = obj;
int pop()
if (size == 0)
cout << "栈为空" << endl;
else
return array[--size];
int top()
if (size == 0)
return NULL;
else
return array[size - 1];
private:
vector<int> array;
int size;
;
class ArrayQueue //用数组实现队列
public:
ArrayQueue(int initsize)
if (initsize < 0)
cout << "数组长度小于0" << endl;
else
vector<int> array(initsize-1);
size = 0;
start = 0;
end = 0;
void push(int obj)
if (size == array.size())
cout << "队列已满" << endl;
else
array[end++] = obj;
size++;
if (end == array.size()) //当队尾到达数组的最后一个位置时,队尾指针转而指向数组的第一个位置
end = 0;
int pop()
if (size == 0)
cout << "队列为空" << endl;
else
size--;
int tmp = start;
if (start == array.size() - 1) //当队首到达数组的最后一个元素时,经过pop操作,指向数组的第一个元素
start = 0;
else
start++;
return array[tmp];
int top()
if(size == 0)
return NULL;
else
return array[start];
private:
vector<int> array;
int size;
int start; //指向队首
int end; //指向队尾元素的后一个位置,该位置为空
;
具有返回min功能的栈
使用两个栈,一个为data栈,一个为min栈。在进行push操作时,首先向data栈中push值,如果push的值小于min栈的栈顶,则向min栈中push这个值,如果大于等于min栈的栈顶,则再push一个min栈栈顶的值。在进行pop操作时,data栈和min栈都对栈顶进行pop。进行top操作,即对data栈取top,进行min操作,即对min栈取top。
class MinStack
public:
void push(int value)
stackdata.push(value);
if (stackmin.empty() || value<stackmin.top()) //压入元素小于min栈顶,则压入该元素;否则再压入一个栈顶元素。
stackmin.push(value);
else stackmin.push(stackmin.top());
void pop()
if (!stackmin.empty())
stackmin.pop();
stackdata.pop();
else
cout << "栈为空" << endl;
int top()
return stackdata.top();
int min()
return stackmin.top();
private:
stack<int> stackmin;
stack<int> stackdata;
;
用两个队列实现栈
使用两个队列,一个为data队列,另一个为help队列。在进行push操作时,向data队列中push值。在进行pop操作时,不断地将data队列的首元素弹出并且压入help队列中,直到data队列中只剩下一个元素,将该元素pop,交换data队列和help队列。在进行top操作时,与pop操作不同的是,不仅要返回data队列中的最后一个元素,还要将这个元素压入help栈中。最后交换data队列和help队列。
class QueueStack
public:
void push(int obj)
queuedata.push(obj);
void pop()
if (queuedata.empty())
cout << "栈为空" << endl;
else
while (queuedata.size() > 1)
queuehelp.push(queuedata.front());
queuedata.pop();
queuedata.pop();
queue<int> tmp = queuehelp;
queuehelp = queuedata;
queuedata = tmp;
int top()
if (queuedata.empty())
return NULL;
else
while (queuedata.size() > 1)
queuehelp.push(queuedata.front());
queuedata.pop();
int res = queuedata.front();
queuedata.pop();
queuehelp.push(res);
queue<int> tmp = queuehelp;
queuehelp = queuedata;
queuedata = tmp;
return res;
private:
queue<int> queuedata;
queue<int> queuehelp;
;
用两个栈实现队列
使用两个栈,一个为push栈,另一个为pop栈。在进行push操作时,向push栈中push值。在进行pop操作时,如果pop栈不为空,直接在pop栈执行pop操作;在pop栈为空时,则将push栈中的栈顶元素依次弹出并且压入pop栈中,再对pop栈执行pop操作。top操作与pop类似。
class StackQueue
public:
void push(int obj)
stackpush.push(obj);
void pop()
if (stackpop.empty() && stackpush.empty())
cout << "队列为空" << endl;
else if (stackpop.empty())
while (!stackpush.empty())
stackpop.push(stackpush.top());
stackpush.pop();
stackpop.pop();
int top()
if (stackpop.empty() && stackpush.empty())
return NULL;
else if (stackpop.empty())
while (!stackpush.empty())
stackpop.push(stackpush.top());
stackpush.pop();
stackpop.top();
private:
stack<int> stackpush;
stack<int> stackpop;
;
以上是关于实现特殊的栈和队列的主要内容,如果未能解决你的问题,请参考以下文章