반응형
회문 확인하기
# 문자열을 큐와 스택에 각각 넣고, 빼서 확인하면 큐에 넣은 문자열은 그대로 나오고, 스택에 넣은 문자열은 뒤집어져서 나온다.
# 이렇게 나온 문자를 각각 확인해서 모두 같으면 그 문자열은 회문이다.
# 입력된 문자열의 길이를 확인할 수 있으므로 배열 기반 스택, 큐를 사용했다.
# 배열 기반 큐를 원형큐로 만드는 부분은 삭제했다.
배열 기반 스택
#pragma once template <typename T> class StackArray { T* capacity; int size; int top; public: bool Push(T data); bool Pop(); T& Peek(); int Count(); int CapacitySize(); public: StackArray(int size); virtual ~StackArray(); }; template <typename T> StackArray<T>::StackArray(int _size) { size = _size; capacity = new T[size]; top = -1; } template <typename T> bool StackArray<T>::Push(T data) { if (top == size - 1) { return false; } capacity[++top] = data; return true; } template <typename T> bool StackArray<T>::Pop() { if (top == -1) { return false; } top--; return true; } template <typename T> T& StackArray<T>::Peek() { return capacity[top]; } template <typename T> int StackArray<T>::Count() { return top + 1; } template <typename T> int StackArray<T>::CapacitySize() { return size; } template <typename T> StackArray<T>::~StackArray() { delete[] capacity; }
배열 기반 큐
#pragma once template <typename T> class QueueArray { T* capacity; int iCount; int iSize; int iFront; int iRear; public: int Add(T data); int Remove(); T Peek(); int Count(); public: QueueArray(int size); virtual ~QueueArray(); }; template <typename T> QueueArray<T>::QueueArray(int size) { capacity = new T[size]; iSize = size; iCount = 0; iFront = 0; iRear = 0; } template <typename T> int QueueArray<T>::Add(T data) { if (iCount == iSize) { return iSize; } capacity[iRear++] = data; return ++iCount; } template <typename T> int QueueArray<T>::Remove() { if (iCount == 0) { return 0; } iFront++; return --iCount; } template <typename T> T QueueArray<T>::Peek() { return capacity[iFront]; } template <typename T> int QueueArray<T>::Count() { return iCount; } template <typename T> QueueArray<T>::~QueueArray() { delete[] capacity; }
메인
#include "Queue_arrayt.h" #include "Stack_array.h" #include <iostream> #include <tchar.h> #if defined(UNICODE) || defined(_UNICODE) #define tcout std::wcout #define tcin std::wcin #else #define tcout std::cout #define tcin std::cin #endif int main() { TCHAR strBuf[256]; std::cout << "회문인지 확인할 문장을 입력하세요." << std::endl; tcin >> strBuf; int strLen = _tcslen(strBuf); QueueArray<TCHAR> unreverse(strLen); StackArray<TCHAR> reverse(strLen); for (int i = 0; i < strLen; i++) { unreverse.Add(strBuf[i]); reverse.Push(strBuf[i]); } bool Palindromes; while (true) { if (unreverse.Peek() != reverse.Peek()) { Palindromes = false; break; } unreverse.Remove(); reverse.Pop(); if (reverse.Count() == 0) { Palindromes = true; break; } } tcout << strBuf << std::endl; if (Palindromes) { tcout << "위 문자열은 회문입니다." << std::endl; } else { tcout << "위 문자열은 회문이 아닙니다." << std::endl; } }
반응형