如何反转一个堆栈
how to reverse a stack
我有一个分配,我应该采取一个堆栈,显示输出,然后反向显示输出。
它应该看起来像这样
Stack:
262 115 74 26 34 243 22 734 113 121
Stack Reversed:
121 113 734 22 243 34 26 74 115 262
我的结果是这样的
Stack:
262 115 74 26 34 243 22 734 113 121 121 113 734 22 243 34 26 74 115 262
Stack Reversed:
有人可以看看我的代码,看看是怎么回事。我试了好几种方法,但都行不通。
#include <stdio.h>
#include <iostream>
#include "linkedStack.h"
using namespace std;
template <class Type>
void printStack(linkedStackType<Type>& stack);
template <class Type>
void reverseStack(linkedStackType<Type>& stack);
int main(int argc, char **argv)
{
// Declare stack variables
linkedStackType<int> stack;
// Add some data to the stack
stack.push(121);
stack.push(113);
stack.push(734);
stack.push(22);
stack.push(243);
stack.push(34);
stack.push(26);
stack.push(74);
stack.push(115);
stack.push(262);
cout << "nStack:n ";
printStack(stack);
reverseStack(stack);
cout << "nStack Reversed:n ";
printStack(stack);
cout << "nn** Press any key to continue **n";
getchar();
return 0;
}
template <class Type>
void printStack(linkedStackType<Type>& stack)
{
Type item;
linkedStackType<Type> tmpStack = stack;
while (stack.isEmptyStack() == false)
{
item = stack.top();
stack.pop();
cout << item << " ";
}
stack = tmpStack;
}
template <class Type>
void reverseStack(linkedStackType<Type>& stack)
{
Type item;
linkedStackType<Type> tmpStack;
while (stack.isEmptyStack() == false)
{
item = stack.top();
stack.pop();
tmpStack.push(item);
}
while (tmpStack.isEmptyStack() == false)
{
item = tmpStack.top();
tmpStack.pop();
stack.push(item);
cout << item;
}
stack = tmpStack;
return;
}
我不是100%,但我想如果你删除reverseStack
的第二个while循环,你的代码将工作。
template <class Type>
void reverseStack(linkedStackType<Type>& stack)
{
Type item;
linkedStackType<Type> tmpStack;
while (stack.isEmptyStack() == false)
{
item = stack.top();
stack.pop();
tmpStack.push(item);
}
//while (tmpStack.isEmptyStack() == false)
//{
// item = tmpStack.top();
// tmpStack.pop();
// stack.push(item);
// cout << item;
//}
stack = tmpStack;
return;
}
在reverseStack()中有一个多余的打印循环,它将值打印到错误的位置。此外,这个打印循环清除tmpStack。
您的第二个while
循环清空tmpStack
,但随后您将现在为空的堆栈分配给stack
,因此您只有一个空的堆栈。
这是我的解决方案来反转std::stack内容:
#include <stack>
#include <algorithm>
template <class T>
class _stack : public std::stack<T>
{
public:
void reverse()
{
std::reverse(this->c.begin(),this->c.end());
}
};
template <class T>
bool reverseStack(std::stack<T> & stack)
{
bool ret = false;
auto * s = reinterpret_cast<_stack<T>*> (&stack);
if(s)
{
s->reverse();
ret = true;
}
return ret;
}
int main()
{
std::stack<int> stack;
stack.push(1);
stack.push(2);
stack.push(3);
stack.push(4);
stack.push(5);
reverseStack(stack);
}
您可以使用相同的方法访问容器并使用迭代器打印值。
void sortStack(struct stack **s)
{
if (!isEmpty(*s))
{
int x = pop(s);
sortStack(s);
sortedInsert(s, x);
}
}
void sortedInsert(struct stack **s, int x)
{
if (isEmpty(*s) || x > top(*s))
{
push(s, x);
return;
}
int temp = pop(s);
sortedInsert(s, x);
push(s, temp);
}
相关文章:
- 在使用堆栈为下一个最大数字编写代码时面临 SIGSEGV(分段错误)
- 使用一个内存集数组和单个堆栈在 O(n) 中查找数组的下一个更大元素
- 使用 STL 交换堆栈 C++ 中的第一个和最后一个元素
- 使用堆栈查找每个元素的下一个更大的元素
- 如何在 C++03 中没有重复代码的情况下在堆栈上创建一个非常量 C 字符串数组?
- 作者在解释C 中的堆栈和堆时犯了一个错误,或者我正在误读某些内容
- 我如何转换一个基于动态的,基于指针的int堆栈,以便将其打印成字符串
- 从一个堆栈移动到另一个堆
- 我认为我有一个堆栈溢出(已达到 SDL 表面限制)
- C++11 Lambda闭包通过引用涉及一个堆栈变量,该变量离开作用域是允许的,但得到了未定义的行为
- 如何调用在另一个堆栈流中创建的函子对象
- 编写一个函数,返回一个堆栈,该堆栈包含所有小于给定数字的元素,并且顺序相同
- 将一个堆栈的值分配给另一个堆栈
- 如何将内容从一个堆栈移动到另一个堆栈
- 我怎么能得到一个堆栈溢出在c++和Unix
- 试图在c++中实现一个堆栈模板(失败得很惨)
- 在我的代码中,scoped_ptr指向一个堆栈变量 - 这是否延长了堆栈变量的生命周期
- 如何反转一个堆栈
- 试图写一个c++堆栈程序
- 通过使用另一个堆栈查找堆栈中的最大值