후입선출 구조이다.
구현 사항
push : O(1)
pop : O(1)
top : O(1)
코드
더보기
#pragma once
#include "GlobalDefine.h"
#include "MyVector.h"
template <typename _Ty>
class MyStack {
public:
explicit MyStack() : vec_() {}
~MyStack() {}
public:
inline void push(const _Ty& _val)
{
vec_.push_back(_val);
}
inline void push(_Ty&& _val)
{
vec_.push_back(std::move(_val));
}
inline void pop()
{
vec_.pop_back();
}
inline _Ty& top()
{
return vec_.back();
}
inline bool empty() const { return size() == 0; }
inline const int& size() const { return vec_.size(); }
private:
MyVector<_Ty> vec_;
};
Stock Span
BOJ 2493 탑 https://www.acmicpc.net/problem/2493
위의 문제와 같은 개념이다.
요점은 입력된 값마다 인덱스를 붙이고, 현재 입력된 값보다 큰 값을 찾을때까지 pop을 수행한다.
pop되는 값이 추후 입력되는 값보다 작더라도 어차피 현재 입력된 값보다 작기 때문에 pop을 해도 상관없다.
일종의 그리디 알고리즘이다.
코드
더보기
#include <iostream>
#include <stack>
using namespace std;
void stockSpan(int price[], const int& n, int span[]) {
stack<pair<int,int>> st;
for (int i = 0; i < n; ++i) {
while (!st.empty() && st.top().second < price[i])
st.pop();
if (st.empty())
span[i] = 1;
else
span[i] = i - st.top().first;
st.push({ i, price[i] });
}
}
int main() {
int price[] = { 100, 80, 60, 70, 60, 75, 85 };
int n = sizeof(price) / sizeof(int);
int span[1000] = {};
stockSpan(price, n, span);
for (int i = 0; i < n; ++i)
cout << span[i] << ' ';
return 0;
}
'이론 > 자료구조&알고리즘' 카테고리의 다른 글
Queue (0) | 2023.02.15 |
---|---|
Linked List (0) | 2023.02.13 |
Divide & Conquer (0) | 2023.02.10 |
Recursion Basics (0) | 2023.02.09 |
Bit Manipulation (0) | 2023.02.09 |