336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.
내가 처음 C++ 을 공부할때와는 문법이 약간 달라진듯 하다.
아래 소스는 현재 통용되는 C++ 문법에 따라 자료구조를 다시 공부하는 중에
한번 만들어 본 스택 구현이다.
BitField라던가, 예외처리, typeid 같은거는 처음 배울 당시 책에는 없었던 기능들이었는데...
최근에 나온 C++0x는 람다식도 지원한다니.
C++이 갈수록 막강해지는 것 같아 재밌다.
/* stdafx.h */ #ifndef __STDAFX_H #define __STDAFX_H #include <iostream> #include <string> #include <exception> #include <stdexcept> #include <cstdio> #include <cstdlib> #include <cstring> #endif
/* tnode.h */
#ifndef __TNODE_H
#define __TNODE_H
namespace Tapito
{
template<typename T>
class TNode
{
public:
operator T()
{
return this->m_Data;
}
operator T*()
{
return &(this->m_Data);
}
TNode()
{
this->m_lpFirstNode = NULL;
this->m_lpPrevNode = NULL;
this->m_lpNextNode = NULL;
this->m_lpLaseNode = NULL;
}
TNode(const T node)
{
this->m_lpFirstNode = NULL;
this->m_lpPrevNode = NULL;
this->m_lpNextNode = NULL;
this->m_lpLaseNode = NULL;
this->m_Data = node;
}
T GetData(void)
{
return this->m_Data;
}
void SetData(T data)
{
this->m_Data = data;
}
private:
TNode<T> * m_lpFirstNode;
TNode<T> * m_lpPrevNode;
TNode<T> * m_lpNextNode;
TNode<T> * m_lpLaseNode;
T m_Data;
};
}
- tstack.h -
#ifndef __TSTACK_H
#define __TSTACK_H
#include "stdlib.h"
#include "tnode.h"
using namespace std;
namespace Tapito
{
template<typename T, int capacity = 255>
class TStack
{
public:
TStack()
{
this->m_iTop = -1;
}
TStack(TStack<T, capacity>& tstack)
{
const TNode<T> * temp = tstack.m_aStack;
int count = 0;
while(count < capacity)
{
this->m_aStack = *temp++;
count++;
}
}
int GetCapacity() const
{
return capacity;
}
int GetCount() const
{
return this->m_iTop + 1;
}
T Pop()
{
if(m_iTop < 0)
{
char msgBuffer[256];
sprintf(msgBuffer, "Tapito::TSTack<T, capacity>::Pop # Stack is empty # 'm_iTop' = %d", this->m_iTop);
string exceptionMessage = msgBuffer;
throw out_of_range(exceptionMessage);
}
return (T)this->m_aStack[m_iTop--];
}
void Push(T element)
{
if(this->m_iTop >= capacity - 1)
{
char msgBuffer[256];
sprintf(msgBuffer, "Tapito::TSTack<T, capacity>::Pop # Stack is full # 'capacity' = %d / 'm_iTop' = %d", capacity, this->m_iTop);
string exceptionMessage = msgBuffer;
throw out_of_range(exceptionMessage);
}
this->m_aStack[++(this->m_iTop)] = (TNode<T>)element;
}
T GetElement(int index)
{
if(!((0 <= index) && (index <= this->m_iTop)))
{
char msgBuffer[256];
sprintf(msgBuffer, "Tapito::TStack<T, capacity>::GetElement # 'index' is out of range # 'm_iTop' = %d / 'index' = %d", this->m_iTop, index);
string exceptionMessage = msgBuffer;
throw out_of_range(exceptionMessage);
}
return (T)this->m_aStack[index];
}
void SetElement(int index, T element)
{
if(!((0 <= index) && (index <= this->m_iTop)))
{
char msgBuffer[256];
sprintf(msgBuffer, "Tapito::TStack<T, capacity>::GetElement # 'index' is out of range # 'm_iTop' = %d / 'index' = %d", this->m_iTop, index);
string exceptionMessage = msgBuffer;
throw out_of_range(exceptionMessage);
}
this->m_aStack[index] = (TNode<T>)element;
}
private:
TNode<T> m_aStack[capacity];
int m_iTop;
};
}
#endif
/* main.cpp */
#include <iostream>
#include <iomanip>
#include <conio.h>
#include "tstack.h"
void printstack(Tapito::TStack<int>& tstack);
void main()
{
try
{
Tapito::TStack<int> tstack;
cout<<"== 1차 =="<<endl;
printstack(tstack);
tstack.push(1);
cout<<"== 2차=="<<endl;"
tstack.push(-1);
tstack.push(100);
tstack.push(200);
tstack.push(300);
cout<<"== 3차=="<<endl;
tstack.pop();
cout<<"== 4차=="<<endl;
}
catch(exception e)
{
cout<<e.what()<<endl;
throw e;
}
catch(...)
{
cout<<"unknown exception"<<endl;
throw;
}
cout<<"end"<<endl;
_getch();
}
void printstack(tapito::tstack<int>& tstack)
{
cout<<"STACK : CAPACITY = "<<tstack.getcapacity()<<", elements="<<tstack.GetCount()<<endl;
for(int i = 0; i < tstack.GetCount(); i++)
{
cout<<" stack["<<setfill('0')<<setw(8)<<i<<"]== "<<tstack.getelement(i)<<endl;
}
}
실행 결과
'자작 프로그램' 카테고리의 다른 글
| 완전 심플 메모장 프로그램 (옴니아 Windows CE용) (0) | 2011.10.09 |
|---|---|
| 숫자 출력 시리즈 1편 - 무지개 피라미드 (0) | 2011.10.09 |
| Windows Mobile용 스톱워치 프로그램 (0) | 2011.04.25 |
| 간단한 C# LINQ 식 예제 (0) | 2011.03.20 |
| 문자열 크로스 예제 (0) | 2011.03.05 |