별도의 공간을 사용하지 않고 창고를 뒤바꿀 수 있습니까?

3271 단어 System
제목: 한 창고를 차례로 뒤집다.예를 들어 입력 창고 {1, 2, 3, 4, 5}, 1은 창고 꼭대기에 있습니다.뒤바뀐 창고는 {5, 4, 3, 2, 1}이고 5곳은 창고 꼭대기에 있다.
분석: 언뜻 이 제목을 보자마자 첫 번째 반응은 창고에 있는 모든 원소를 하나하나 팝업해서 한 그룹에 넣고 그 다음에 그룹에서 모든 원소를 뒤바꾸어 마지막에 그룹의 모든 원소를 하나하나push로 창고에 넣는 것이다.이때 창고도 뒤바뀌었다.하나의 수조를 뒤바꾸는 것은 매우 쉬운 일이다.그러나 이런 사고방식은 길이가 O(n)인 그룹을 분배하는 것을 보여야 하고 귀속의 특성을 충분히 이용하지 못한다.
우리는 어떻게 귀속할지 다시 한번 고려해 보자.우리는 창고 {1, 2, 3, 4, 5}를 두 부분으로 구성한다. 창고 꼭대기 원소 1과 나머지 부분 {2, 3, 4, 5}이다.만약에 우리가 {2, 3, 4, 5}를 뒤집어서 {5, 4, 3, 2}로 바꾸고 원래의 창고 꼭대기 원소 1을 밑에 놓을 수 있다면 전체 창고는 뒤집어져서 {5, 4, 3, 2, 1}로 변한다.
다음에 우리는 두 가지 일을 고려해야 한다. 첫째, 어떻게 {2, 3, 4, 5}를 거꾸로 해서 {5, 4, 3, 2}로 바꿀 것인가.우리는 {2, 3, 4, 5}를 두 부분으로 구성된다고 보기만 하면 창고 꼭대기 원소 2와 나머지 부분 {3, 4, 5}이다.우리는 {3, 4, 5}를 먼저 뒤집어서 {5, 4, 3}로 만든 다음에 이전의 창고 꼭대기 원소 2를 맨 밑에 놓으면 {5, 4, 3, 2}가 된다.
{3, 4, 5}를 어떻게 거꾸로 하는지... 많은 독자들이 이것이 귀속이라고 생각할 것이다.즉, 매번 창고를 뒤집으려고 시도할 때마다 현재 창고 꼭대기 원소가 팝업되고 나머지 원소로 구성된 창고를 뒤집고 마지막으로 이전의 창고 꼭대기 원소를 나머지 원소로 구성된 창고의 밑에 놓는다.귀속이 끝난 조건은 남은 창고가 이미 비어 있다는 것이다.이러한 사고방식의 코드는 다음과 같다.
만약에 제가 먼저 int를 예로 들게요.
//ReverseStack3.cpp: 콘솔 프로그램의 입구점을 정의합니다.//
#include "stdafx.h"#include #include using namespace std;/* if(Stack.empty()) { Stack.push(data); } else {int top=Stack.top();//2를 넣을 때 1을 Stack.pop();AddToButton(Stack, data);Stack.push(top);//1을 창고에 넣고 2를 넣습니다}*/
void AddToButton(stack& Stack,int data) {  if (Stack.empty())  {   Stack.push(data);  }  else  {   int top=Stack.top();   Stack.pop();   AddToButton(Stack,data);   Stack.push(top);  }
} void ReverseStack(stack& Stack) {  if (!Stack.empty())  {   int top=Stack.top();   Stack.pop();   ReverseStack(Stack);   AddToButton(Stack,top);  }   } int _tmain(int argc, _TCHAR* argv[]) {  int a[]={1,2,3,4,5};  stack T;  for (int i=0;i<5;i++)  {   T.push(a[i]);  }  ReverseStack(T);  while (!T.empty())  {   cout< 
// ReverseStack3.cpp :  。
//

#include "stdafx.h"
#include <iostream>
#include <stack>
using namespace std;
/*
if(Stack.empty())
{
Stack.push(data);
}
else
{
int top=Stack.top();// 2 1 
Stack.pop();
AddToButton(Stack,data);
Stack.push(top);//1 2 
}
*/

void AddToButton(stack<int>& Stack,int data)
{
	if (Stack.empty())
	{
		Stack.push(data);
	}
	else
	{
		int top=Stack.top();
		Stack.pop();
		AddToButton(Stack,data);
		Stack.push(top);
	}

}
void ReverseStack(stack<int>& Stack)
{
	if (!Stack.empty())
	{
		int top=Stack.top();
		Stack.pop();
		ReverseStack(Stack);
		AddToButton(Stack,top);
	}
	
}
int _tmain(int argc, _TCHAR* argv[])
{
	int a[]={1,2,3,4,5};
	stack<int> T;
	for (int i=0;i<5;i++)
	{
		T.push(a[i]);
	}
	ReverseStack(T);
	while (!T.empty())
	{
		cout<<T.top();
		T.pop();
	}
	system("pause");
	return 0;
}


 
 
 
 

좋은 웹페이지 즐겨찾기