public interfaceStack
{ publicint size()
public boolean isEmpty()
public Object top() throws EmptyStackException
public void push (Object o) throws FullStackException
public Object pop()
throws EmptyStackException
}
성능 :
- space : O(n)
- 각 연산 : O(1)
- 단점.
1. size limit을 갖는다. stack의 max size가 predefined되어있으며 바뀔 수 없다.
2. array의 특징으로, 메모리 낭비를 하게 된다.
14
push 1
push 2
top
size
empty
pop
pop
pop
size
empty
pop
push 3
empty
top
출력
2
2
0
2
1
-1
0
1
-1
0
3
#include <iostream>
#include <string>
using namespace std;
class my_stack {
private:
int v[10001];
int f_t;
int f_size;
int (my_stack::*p_arr[4])(void) = { &my_stack::pop,&my_stack::top,&my_stack::size,&my_stack::empty };
public:
my_stack() {
f_t = -1;
}
int push(int a);
int pop();
int size();
int empty();
int top();
int execute(int n);
};
int N;
my_stack m_stack;
string func_arr[4] = { std::string("pop"),std::string("top"),std::string("size"),std::string("empty") };
int my_stack::push(int a)
{
//std::cout << "push()\n";
v[f_size] = a;
f_t++;
f_size++;
return 0;
}
int my_stack::pop()
{
//std::cout << "pop()\n";
if (empty()) return -1;
else {
int temp = v[f_t];
f_t--;
f_size--;
return temp;
}
}
int my_stack::size()
{
return f_size;
}
int my_stack::empty()
{
return (f_t == -1);
}
int my_stack::top()
{
if (empty()) return -1;
else return v[f_size-1];
}
int my_stack::execute(int n)
{
int result =(this->*p_arr[n])();
return result;
}
int main()
{
char c;
std::cin >> N;
cin.get(c);
std::string func;
std::string deli = " ";
for (int i = 0; i < N; i++)
{
std::getline(std::cin,func);
//std::cout << "func : " + func << std::endl;
int pos = func.find(deli);
int result;
if (pos == -1) {
for (int i = 0; i < 4; i++) {
if (func_arr[i] == func) { // std에 string 인자들에 대한 == operator가 오버라이딩 되어있다.
int check = m_stack.execute(i);
cout <<check << endl;
break;
}
}
}
else {
string function = func.substr(0, pos);
string data = func.substr(pos+1, func.length());
m_stack.push(stoi(data));
}
}
}
쉽게는 getline() 함수 사용 : '\n' 이나 /end of file이나 /사용자가 지정한 delimeter에/ 도달할 때 까지 read한다.
- std::string 에 대해서도 overriding 되어 있다.
int N;
string temp;
cin >> N ;
for(int i=0;i<3;i++){
std::getline(std::cin, temp);
}
입력 : 3
push 5
pop
push
첫 번째 getline : "\n" 을 입력받는다.
두 번째 getline : push 5
세 번째 getline : pop
💥이렇게 되는 이유
- 3은 변수 N에 들어가지만 newline character는 input stream(istream.즉 cin객체)에 남아있게 된다.
- 이 상태에서 다시 한 번 cin을 쓴다면 이 newline은 그저 whitespace로 여겨져서 무시되지만,
- 이 상태에서 getline()을 쓰게 된다면 이 getline()의 호출에서는 newline을 읽게 되는 것이다.
🔑 해결방법
- 해결방법 0 : getline() 전에 std::ws(cin); 을해서 whitespace를 skip하기. : 이는 '\n' 에 이어 오는 whitespace들도 skip을 하게 된다는 것에 유의해야 한다.
- 해결방법 1 : cin>>N; 이후 getline()전에 cin.getc(char c); 를 호출하기
- 해결방법 2 : getline을 사용하지 않고 cin >> string ; 하기
- 해결방법 2에서 "push"의 경우, data를 받기 위한 cin>> int data; 를 한 번 더 해야한다.
my_stack m_stack;
int (my_stack::*p)(void) = &my_stack::pop;
int data = (m_stack.*p)();
int (my_stack::*p)(void) = &mystack::pop;
int (my_stack::*p_arr[4])(void) =
{ &my_stack::pop,&my_stack::top,
&my_stack::size,&my_stack::empty };
class my_stack{
.....
}
int (my_stack::*p_arr[4])(void) = { &my_stack::pop,&my_stack::top,&my_stack::size,&my_stack::empty };
int main()
{
my_stack m_stack;
......
int i=3;
int check = (m_stack.*p_arr[i])();
..
}
클래스 외부에 선언된 포인터 배열을 클래스 외부에서 사용시.
m_stack.*p_arr[i])();
클래스 내부에서 선언된 포인터 배열을 클래스 내부에서 사용시.
(this->*p_arr[n])();