본문 바로가기
기술자료/C C++

동적할당으로 스텍 만들기

by 알 수 없는 사용자 2009. 8. 3.
728x90
반응형


동적할당을 사용해서 스택 만들기 입니다.
기본 최대 크기 스택은 지정을 해주었구요 기본 최대크기 이상의 스택을 만들려고 할경우 기본 크기 (10)로 만들어 지게 되어 있습니다.

그리고 최대치를 넘지 않고 설정된 스택최대치 까지 갈경우 스택을 하나씩 증가시켜서 생성되게 만들어 놓은 프로 그램입니다.

#include <iostream.h>
#include <string.h> //memcpy 를 쓰기 위한 해더파일 정의

const int stack_max =100; //스택의 최대 크기 지정

//스택 클래스 지정
class Stack
{
 private:
  int iSize;
  int *iaElem; //스택메모리 포이터
  int  *temp1; //스택메모리를 증가 시기키위한 포인터
  int  iMax; //사용자가 지정해주는 스택크기
 
//동적할당 함수 
 void Init()
  {
   iaElem = new int[iMax];
   iSize =0;
  }

 public:
  Stack(int Size);
  ~Stack();
  bool Push(int iItem);
  bool Pop(int &iItem);
  void Print();
 
};

//생성자
Stack::Stack(int Size)
{
//최대 지정되어 있는 크기를 초과하게 될경우 기본 크기로 생성하게 됩니다.
 if(stack_max < Size)
 {
  cout << "너무 큰크기입니다 기본 크기로 생성합니다 기본 크기는 10 입니다 \n";
  Size =10;  
 }
 iMax = Size;
 Init();
}
//소멸자
Stack::~Stack()
{
 delete []iaElem; //만들어진 메모리를 지우는 역활을 합니다.
}

//스택에 입력되는 함수
bool Stack::Push(int iItem)
{
 if(stack_max <= iMax)
 {
  return false;
 }
//스택이 가득차게 되면 스택의 최대 크기를 한칸 증가 시기는 코드
 if(iMax == iSize)
 {
  cout << "지정된 스택 size 최대 크기입니다 스택을 1 증가 시킵니다 \n";  
  iMax +=1;
  temp1 = new int [iMax]; //크기를 한칸 크게 해서 메모리를 할당 합니다.
  memcpy(temp1,iaElem,iSize*4); //메모를 카피를 하게 됩니다 (int형이 4바이트이기에 iSize에 4
                                            를 곱해 주었습니다 )
  delete []iaElem; //기존에 있는 메모리를 지워주고
  iaElem = temp1; //만들어 놓은 곳을 가르키기 만들었습니다.
  
 }
 
 iaElem[iSize] = iItem;
 ++iSize;
 cout<<"Stack Size = "<< iSize << endl;
 return true;
}

//맨위에서 부터 하나씩 끄집어 내는 함수
bool Stack::Pop(int &iItem)
{
 if(0 >= iSize)
 {
  return false;
 }
 Print();
 --iSize;
 iItem = iaElem[iSize];
 return true;
}

//출력 함수
void Stack::Print()
{
 cout<<"Stack Size = "<< iSize << endl;
 int iCnt = iSize;
 while(1)
 { 
  --iCnt;
  if(0>iCnt)
   break;
  cout << "[" << iCnt << "]"  << iaElem[iCnt] <<endl;
 }
}

int main()
{
 Stack A(101);
 int a(0);

 A.Push(1);
 A.Push(2);
 A.Push(3);
 A.Push(4);
 A.Push(5);
 A.Push(6);
 A.Push(7);
 A.Push(8);
 A.Push(9);
 A.Push(10);
 A.Push(11);
 A.Push(12);
 A.Push(13);
 A.Push(14);
 A.Push(15);

 A.Pop(a);
 cout << a << endl;
 A.Pop(a);
 cout << a << endl;
 A.Pop(a);
 cout << a << endl;
 A.Pop(a);
 cout << a << endl;
 A.Pop(a);
 cout << a << endl;
 A.Pop(a);
 cout << a << endl;
 A.Pop(a);
 cout << a << endl;
 A.Pop(a);
 cout << a << endl;
 A.Pop(a);
 cout << a << endl;
 A.Pop(a);
 cout << a << endl;
 A.Pop(a);


 
 return 0;
}
실행 화면


^^;
부족한 부분 뎃글 부탁드립니다 ^^
728x90