STL vector 이용해서 stack을 짯는데요...

프로그래밍 일반에 관한 포럼입니다.

운영자: 류광

Locked
비회원

STL vector 이용해서 stack을 짯는데요...

전체글 글쓴이: 비회원 » 2009-11-17 03:39

코드: 모두 선택

#ifndef _STACK_H_
#define _STACK_H_

#include <vector>

template<typename T>
class Stack {
private:
	std::vector<T> elems;
	bool m_running;
public:
	Stack() {
		m_running = true;
	}
	~Stack() {
		m_running = false;
	}
	void push(const T& elem) {
		elems.push_back(elem);
	}
	T top();
	void pop();
	bool empty() const {
		return elems.empty();
	}
	bool Running() { 
		return m_running; 
	}
};

template<typename T>
void Stack<T>::pop() {

	T elem = elems.back();
	elems.pop_back();
}

template<typename T>
T Stack<T>::top() {
	return elems.back();
}

#endif  _STACK_H_

이렇게 짯는데요...
제가 파이로 4만 자리까지 계산하려고 무작정 돌렸더니...
실행 도중에 에러가 나네요...

vector 에도 배열 식으로 공간을 만들어줘야하는건가요?
그건 아닌것 같은데;;...음;...

비회원

아...문제가 되는데가 - _=;

전체글 글쓴이: 비회원 » 2009-11-17 04:05

코드: 모두 선택

template<typename T>
T Stack<T>::pop() {
	if(elems.empty()) {
		std::cout << "Stack<>::pop() : empty stack" << std::endl;
	}
	T elem = elems.back();
	elems.pop_back();
	return 0;
}
이부분인데요...

pop 만 시키면 debug assertion failed 뜨네요...ㅡ;

제가 백터 사용을 잘못한걸까요 - ㅅ=?;...


훔...;

비회원

..

전체글 글쓴이: 비회원 » 2009-11-17 04:17

template<typename T>
T Stack<T>::pop() {
if(elems.empty()) {
std::cout << "Stack<>::pop() : empty stack" << std::endl;
}
T elem = elems.back();
elems.pop_back();
return 0;
}
T elem = elems.back();

이부분이 이상한데요. back() 을 해서 elem 를 얻는데. 실제로 후에 얻은 elem 를 처리하실진 몰라도

elems 가 비워져 있으면 back() 시 예외가 발생하겠죠.

elems.pop_back();

이 부분도 pop_back 이 elems 가 비워져 있을경우 msdn 에 어떠게 처리된다고 명시는 안되어 있는데

vector 소스 참조하셔서 그냥 쓰실지 empty 일 경우 따로 처리하실지 결정하시구요.

pyw8329
전체글: 5
가입일: 2006-06-07 10:59
사는 곳: 없음

Re: 아...문제가 되는데가 - _=;

전체글 글쓴이: pyw8329 » 2009-11-17 09:11

비회원 작성:

코드: 모두 선택

template<typename>
T Stack<T>::pop() {
	if(elems.empty()) {
		std::cout << "Stack<>::pop() : empty stack" << std::endl;
	}
	T elem = elems.back();
	elems.pop_back();
	return 0;
}
이부분인데요...

pop 만 시키면 debug assertion failed 뜨네요...ㅡ;

제가 백터 사용을 잘못한걸까요 - ㅅ=?;...


훔...;
위에 분이 말씀하신데로
위에서 요소값이 없는걸 채크한 후에 back() 함수 이하의 부분이 실행 되지 않게 하셔야 될듯 합니다.
요소가 없는데 back()가 호출되면 문제가 될테니까요 즉,
if (elems.empty() )
{
// 없다고 표시코드;
return -1;
}

위와 같은 식으로 하시면 될듯 합니다.
^^

비회원

전체글 글쓴이: 비회원 » 2009-11-18 08:58

... std::stack이 있는데 왜 구지...ㅡ,.ㅡ;

Locked