์คํ์ ํ์ชฝ ๋์์๋ง ์๋ฃ๋ฅผ ๋ฃ๊ณ ๋บ ์ ์๋ ์๋ฃ๊ตฌ์กฐ์ด๋ค.
LIFO(Last In First Out) ๋ง์ง๋ง์ผ๋ก ๋ฃ์ ๊ฒ์ด ๊ฐ์ฅ ๋จผ์ ๋์จ๋ค. ์ฆ, ์
๋ ฅ์์์ ์ญ์์ ์ถ๋ ฅ์ด ํ์ํ ๊ฒฝ์ฐ์ ์ฌ์ฉํ๋ ๊ฒ์ด ์ข๋ค.
์๋ํฐ์์ ๋๋๋ฆฌ๊ธฐ(undo) ๊ธฐ๋ฅ
ํจ์ ํธ์ถ ์ ๋ณต๊ท์ฃผ์ ๊ธฐ์ต
| |
| ์คํ์ ์๋ฃ๋ฅผ ๋ฃ๋ ์ฐ์ฐ |
| ์คํ์์ ์๋ฃ๋ฅผ ๋นผ๋ ์ฐ์ฐ |
| ์คํ์ ๊ฐ์ฅ ์์ ์๋ ์๋ฃ๋ฅผ ๋ณด๋ ์ฐ์ฐ |
| ์คํ์ด ๋น์ด์๋์ง ์๋์ง๋ฅผ ์์๋ณด๋ ์ฐ์ฐ |
| ์คํ์ด ํฌํ์ํ์ธ์ง ๊ฒ์ฌํ๋ ์ฐ์ฐ |
| ์คํ์ ์ ์ฅ๋์ด์๋ ์๋ฃ์ ๊ฐ์๋ฅผ ์์๋ณด๋ ์ฐ์ฐ |
์คํ์ ๊ตฌํ
๋ฐฐ์ด
์ฅ์ : 1์ฐจ์ ๋ฐฐ์ด๋ก ์ฝ๊ฒ ๊ตฌํํ ์ ์๋ค.
๋จ์ : ๋ฌผ๋ฆฌ์ ์ผ๋ก ํฌ๊ธฐ๊ฐ ๊ณ ์ ๋ ๋ฐฐ์ด์ ์ฌ์ฉํ๋ฏ๋ก ์คํ์ ํฌ๊ธฐ ๋ณ๊ฒฝ์ด ์ด๋ ต๋ค.
#include <stdio.h>
#define MAX 20
typedef struct{
int stack[MAX];
int top; //stack์ด ๋น์ด์์ ๊ฒฝ์ฐ -1
}StackType;
void init(StackType *s);
int is_full(StackType *s);
int is_empty(StackType *s);
int peak(StackType *s);
void push(StackType *s, int );
int pop(StackType *s);
//์คํ ์ด๊ธฐํ
void init(StackType *s){
s->top = -1;
}
int is_empty(StackType *s){
return (s->top == -1);
}
int is_full(StackType *s){
return (s->top == MAX-1);
}
int peak(StackType *s){
if(is_empty(s)){
printf("์คํ์ด ๋น์ด์์ต๋๋ค.");
return -1;
}else return s->stack[s->top];
}
void push(StackType *s, int data){
if(is_full(s)){
printf("์คํ์ ๊ณต๊ฐ์ด ์์ต๋๋ค.");
}else{
s->stack[++s->top]=data;
}
}
int pop(StackType *s){
if(is_empty(s)){
printf("์คํ์ด ๋น์ด์์ต๋๋ค.");
return -1;
}else{
return s->stack[s->top--];
}
}
#include <iostream>
#include <string>
using namespace std;
struct Stack {
int data[10000];
int size;
Stack() {
size = 0;
}
void push(int num) {
data[size] = num;
size += 1;
}
bool empty() {
if (size == 0) {
return true;
} else {
return false;
}
}
int pop() {
if (empty()) {
return -1;
} else {
size -= 1;
return data[size];
}
}
int top() {
if (empty()) {
return -1;
} else {
return data[size-1];
}
}
};
int main() {
int n;
cin >> n;
Stack s;
while (n--) {
string cmd;
cin >> cmd;
if (cmd == "push") {
int num;
cin >> num;
s.push(num);
} else if (cmd == "top") {
cout << (s.empty() ? -1 : s.top()) << '\n';
} else if (cmd == "size") {
cout << s.size << '\n';
} else if (cmd == "empty") {
cout << s.empty() << '\n';
} else if (cmd == "pop") {
cout << (s.empty() ? -1 : s.top()) << '\n';
if (!s.empty()) {
s.pop();
}
}
}
return 0;
}
# ํ์ด์ฌ์์๋ ์คํ์ ์ด์ฉํ ๋ ๋ณ๋์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํ ํ์ ์์.
# ๊ธฐ๋ณธ ๋ฆฌ์คํธ์์ append(), pop() ๋ฉ์๋๋ฅผ ์ด์ฉํ๋ฉด ์คํ๊ณผ ๋์ผํ๊ฒ ๋์
stack = []
stack.append(1)
stack.appned(5)
stack.pop()
์ฐ๊ฒฐ ๋ฆฌ์คํธ
์ฅ์ : ํฌ๊ธฐ๊ฐ ์ ํ๋์ง ์๋๋ค.
๋จ์ : ๊ตฌํ์ด ๋ณต์กํ๊ณ ์ฝ์
์ด๋ ์ญ์ ์๊ฐ์ด ์ค๋๊ฑธ๋ฆฐ๋ค.
#include <stdio.h>
#include <stdlib.h>
typedef struct stack{
int data;
struct stack * next;
}Stack;
void init(Stack *s);
int is_empty(Stack *s);
int peak(Stack *s);
void push(Stack **,Stack **, int );
void pop(Stack **,Stack **);
#include "stack_list.h"
Node * new_node(int data){
Node * new = (Node *)malloc(sizeof(Node));
new->next=NULL;
new->data = data;
return new;
}
//์คํ ์ด๊ธฐํ
void init(Stack *s){
s = NULL;
}
int is_empty(Stack *s){
return (s == NULL);
}
int peak(Stack *s){
if(is_empty(s)){
printf("์คํ์ด ๋น์ด์์ต๋๋ค.");
return -1;
}else return s->data;
}
void push(Stack **top, int data){
Stack * new;
if(is_empty(*top)){
new=new_node(data);
}
else{
new = new_node(data);
new->next = *top;
}
*top=new;
}
void pop(Stack **top){
Node * p = *top;
if(is_empty(p)){
printf("์คํ์ด ๋น์ด์์ต๋๋ค.\n");
return ;
}
*top = p->next;
free(p);
}
๊ตฌํํ๋ ๊ฒ๋ณด๋ค ์ง์ฌ์ ธ ์๋ ๊ฒ์ ์ฐ๋๊ฒ ์ข๋ค.
#include <iostream>
#include <stack>
#include <string>
using namespace std;
int main ()
{
stack<int> mystack;
int n;
scanf("%d",&n);
while(n--){
string ss;
cin >> ss;
if(ss=="push"){
int num;
scanf("%d",&num);
mystack.push(num);
} else if(ss=="top"){
cout << (mystack.empty() ? -1 : mystack.top())<<"\n";
} else if(ss=="size"){
cout << mystack.size()<<"\n";
} else if(ss=="empty"){
cout << mystack.empty()<<"\n";
} else if(ss=="pop"){
cout << (mystack.empty() ? -1 : mystack.top())<<"\n";
if(!mystack.empty()){
mystack.pop();
}
}
}
}
์ค์ต
๊ดํธ(VPS)
์ฌ๋ฐ๋ฅธ ๊ดํธ ๋ฌธ์์ด์ ์์
์ฌ๋ฐ๋ฅธ ๊ดํธ ๋ฌธ์์ด์ด ์๋ ์
์คํ์ ์ด์ฉํด์ ๊ดํธ ๋ฌธ์์ด์ธ์ง ์๋์ง ์ ์ ์๋ค. 1. (
๊ฐ ๋์ค๋ฉด ์คํ์ ๋ฃ๋๋ค. 2. )
๊ฐ ๋์ค๋ฉด ์คํ์์ ํ๋๋ฅผ ๋นผ์ (
์ธ์ง ํ์ธํ๋ค.
์๊ฐ๋ณต์ก๋ O(N^2)
=> ์คํ์ ์ด์ฉํด์ O(N)์ O(1)๋ก ์ค์ผ ์ ์๋ค.
[์์]
๋ชจ๋ ๊ณผ์ ์ด ๋๋ ํ ์คํ์ด ๋น์ด์์ผ๋ฏ๋ก ์ฌ๋ฐ๋ฅธ ๊ดํธ ๋ฌธ์์ด์ด๋ค. ๋ง์ฝ ๋ชจ๋ ๊ณผ์ ์ด ๋๋ ํ ์คํ์ด ๋น์ด์์ง ์์ผ๋ฉด ์ฌ๋ฐ๋ฅธ ๊ดํธ ๋ฌธ์์ด์ด ์๋๋ค.
๊ทธ๋ฌ๋ฏ๋ก ์คํ์ ๋ช๊ฐ(size)๊ฐ ๋ค์ด๊ฐ ์๋์ง๊ฐ ์ค์ํ๋ค!
#include <iostream>
#include <stack>
#include <string>
using namespace std;
string valid(string s){
int cnt=0;
for(int i=0;i<=s.size();i++){
if(s[i]=='('){
cnt += 1;
}else if(s[i]==')'){
cnt -= 1;
}
if (cnt < 0) {
return "NO";
}
}
if (cnt == 0) {
return "YES";
}else{
return "NO";
}
}
int main(){
int t;
cin >> t;
while(t--){
string ps;
cin >> ps;
cout<<valid(ps)<<"\n";
}
}
๊ดํธ ์ฐ์ ์์
๊ท์น
๋๊ดํธ'[]'๋ ์ค๊ดํธ'{}', ์๊ดํธ'()' ์์ ์ฌ ์ ์๋ค.
์ค๊ดํธ๋ ์๊ดํธ ์์ ์ฌ ์ ์๋ค.
์ฌ๋ ๊ดํธโ(โ,โ{โ,โ[โ๊ฐ ๋์ค๋ฉด ์คํ์ ๋ฃ๋๋ค.
๋ซํ ๊ดํธ โ)โ,โ}โ,โ]โ๊ฐ ๋์ค๋ฉด ์คํ์์ ๋บ๋ค. pop() ์ด๋, ์คํ์ top์ด ๊ดํธ ์ง์ด ๋ง์์ผํ๋ค.
๋ซํ ๊ดํธ๊ฐ ๋์์ ๋ ์คํ์ด ๋น์ด์๋ค๋ฉด ์ฌ๋ฐ๋ฅธ ๊ดํธ ๋ฌธ์์ด์ด ์๋๋ค.
๋ชจ๋ ๊ณผ์ ์ด ๋๋ ํ ์คํ์ด ๋น์ด์์ผ๋ฏ๋ก ์ฌ๋ฐ๋ฅธ ๊ดํธ ๋ฌธ์์ด์ด๋ค. ๋ง์ฝ ๋ชจ๋ ๊ณผ์ ์ด ๋๋ ํ ์คํ์ด ๋น์ด์์ง ์์ผ๋ฉด ์ฌ๋ฐ๋ฅธ ๊ดํธ ๋ฌธ์์ด์ด ์๋๋ค.
int check(char c,Node **top){
switch (c) {
case '(':
push(top, 2);
break;
case '{':
if(is_empty(*top))push(top, 1);
else{
if(peak(*top)==2){
printf("[๊ท์น2]์คํจ\n");
return -1;
}
push(top, 1);
}
break;
case '[':
if(is_empty(*top))push(top, 0);
else{
if(peak(*top)!=0){
printf("[๊ท์น1]์คํจ\n");
return -1;
}
push(top, 0);
}
break;
case ')':
if(is_empty(*top)){
printf("[๊ท์น5]์คํจ\n");
return -1;
}else if(peak(*top)!=2){
printf("[๊ท์น4]์คํจ\n");
return -1;
}
pop(top);
break;
case '}':
if(is_empty(*top)){
printf("[๊ท์น5]์คํจ\n");
}else if(peak(*top)!=1){
printf("[๊ท์น4]์คํจ\n");
return -1;
}
pop(top);
break;
case ']':
if(is_empty(*top)){
printf("[๊ท์น5]์คํจ\n");
}else if(peak(*top)!=0){
printf("[๊ท์น4]์คํจ\n");
return -1;
}
pop(top);
break;
default:
printf("์๋ชป ์
๋ ฅ ํ์ต๋๋ค.\n");
break;
}
return 1;
}
int main(int argc, const char * argv[]) {
Stack * top = NULL;
int res = 0;
char c;
printf("๊ฐ์ ์
๋ ฅํด์ฃผ์ธ์. : ");
while ((c = getchar()) && c != EOF && c!='\n') {
res = check(c, &top);
if(res==-1)break;
if(peak(top)!=-1)printf("์คํ top : %c\n",bracket[peak(top)]);
}
if(res!=-1){
if (is_empty(top)) {
printf("\n==๊ดํธ ๊ฒ์ฌ ์ฑ๊ณต==\n");
}else{
printf("\n==[๊ท์น6]์คํจ==\n");
}
}
}
์ ๋ง๋๊ธฐ
๋ ์ด์ ๋ ์ฌ๋ ๊ดํธ์ ๋ซ๋ ๊ดํธ์ ์ธ์ ํ(์ธ๋ฑ์ค ์ค์) ์ ()
์ผ๋ก ํํํ๋ค. ๋ํ, ๋ชจ๋ ()
๋ ๋ฐ๋์ ๋ ์ด์ ๋ฅผ ํํํ๋ค.
์ ๋ง๋๊ธฐ์ ์ผ์ชฝ ๋์ (
๋ก, ์ค๋ฅธ์ชฝ ๋์ ๋ซํ ๊ดํธ)
๋ก ํํํ๋ค.
()
๊ฐ ๋์ฌ ๋๋ง๋ค ์คํ์ ๋ค์ด ์๋ (
์ ๊ฐ์๋ฅผ ์ธ์ด์ค๋ค.
)
๊ฐ ๋์์ ๋๋ ๋ ์ด์ ์ธ์ง ์ ๋ง๋๊ธฐ ์ธ์ง ๊ตฌ๋ถ์ ํด์ค๋ค.
๋ ์ด์ ๋ ํญ์ ๋ถ์ด์ง ์ํ๋ก ๋์ค๋ฏ๋ก ์คํ์ (
์ ์ธ๋ฑ์ค์ 1์ฐจ์ด๊ฐ ๋๋์ง ํ์ธํด์ผํ๋ค.
#include <iostream>
#include <stack>
#include <string>
using namespace std;
int main(){
stack<int> s;
int cnt=0;
string ps;
cin >> ps;
for(int i=0;i<=ps.size();i++){
if(ps[i]=='('){
s.push(i);
}else if(ps[i]==')'){
if(i==s.top()+1){
s.pop();
cnt+=s.size();
}else{
s.pop();
cnt+=1;
}
}
}
cout << cnt << "\n";
}
์๋ํฐ
์ปค์๋ ๋ฌธ์ฅ์ ๋งจ ์, ๋งจ ๋ค, ์ค๊ฐ ์์์ ๊ณณ์ ์์ฐจํ ์ ์๋ค.
L : ์ปค์๋ฅผ ์ผ์ชฝ์ผ๋ก ํ์นธ ์ฎ๊น
D : ์ปค์๋ฅผ ์ค๋ฅธ์ชฝ์ผ๋ก ํ์นธ ์ฎ๊น
B : ์ปค์ ์ผ์ชฝ์ ์๋ ๋ฌธ์๋ฅผ ์ญ์
P $ : $๋ผ๋ ๋ฌธ์๋ฅผ ์ปค์ ์ค๋ฅธ์ชฝ์ ์ถ๊ฐ
์ปค์๋ฅผ ๊ธฐ์ค์ผ๋ก ์ผ์ชฝ ์คํ๊ณผ ์ค๋ฅธ์ชฝ ์คํ์ผ๋ก ๋๋ ์ ๋ฌธ์ ๋ฅผ ํ ์ ์๋ค.
abc|xyz
(|๋ ์ปค์)
P$ $๋ฅผ ์ปค์ ์ผ์ชฝ์ ์ถ๊ฐํ๊ณ ์ปค์๋ $์ ์ค๋ฅธ์ชฝ์ ์์น
O(N^2)์์ ์คํ์ ์ฌ์ฉํ๋ฉด O(N)์ผ๋ก ์๊ฐ๋ณต์ก๋๊ฐ ์ค์ด๋ ๋ค.
#include <cstdio>
#include <cstring>
#include <stack>
using namespace std;
char a[600000];
int main() {
scanf("%s",a);
stack<char> left, right;
int n = strlen(a);
for (int i=0; i<n; i++) {
left.push(a[i]);
}
int m;
scanf("%d",&m);
while (m--) {
char what;
scanf(" %c",&what);
if (what == 'L') {
if (!left.empty()) {
right.push(left.top());
left.pop();
}
} else if (what == 'D') {
if (!right.empty()) {
left.push(right.top());
right.pop();
}
} else if (what == 'B') {
if (!left.empty()) {
left.pop();
}
} else if (what == 'P') {
char c;
scanf(" %c",&c);
left.push(c);
}
}
while (!left.empty()) {
right.push(left.top());
left.pop();
}
while (!right.empty()) {
printf("%c",right.top());
right.pop();
}
printf("\n");
return 0;
}
ํ์ ํ๊ธฐ์
์์์ ํ๊ธฐ๋ฐฉ๋ฒ
์ ์ ํ๊ธฐ๋ฒ : ์ฐ์ฐ์๋ฅผ ํผ์ฐ์ฐ์ ์์ ํ๊ธฐํ๋ ๋ฐฉ๋ฒ (+AB
)
์ค์ ํ๊ธฐ๋ฒ : ์ฐ์ฐ์๋ฅผ ํผ์ฐ์ฐ์ ์ค๊ฐ์ ํ๊ธฐํ๋ ๋ฐฉ๋ฒ (A+B
)
ํ์ํ๊ธฐ๋ฒ : ์ฐ์ฐ์๋ฅผ ํผ์ฐ์ฐ์ ๋ค์ ํ๊ธฐํ๋ ๋ฐฉ๋ฒ (AB+
)
์์์ ์ผ์ชฝ์์ ์ค๋ฅธ์ชฝ์ผ๋ก ์ค์บํ์ฌ
ํผ์ฐ์ฐ์์ด๋ฉด ์คํ์ ์ ์ฅ
์ฐ์ฐ์์ด๋ฉด ํ์ํ ์๋งํผ์ ํผ์ฐ์ฐ์๋ฅผ ์คํ์์ pop
์ฐ์ฐ์ ๊ฒฐ๊ณผ๋ฅผ ๋ค์ ์คํ์ ์ ์ฅ
์์ )82/3-32*+
01. push(8) ์คํ : 8
02. push(2) ์คํ : 8 2
03. second<-pop(2) first<-pop(8) push(first/second) ์คํ : 4
05. push(3) ์คํ : 4 3
06. second<-pop(3) first<-pop(4) push(first-second) ์คํ : 1
07. push(3) ์คํ : 1 3
08. push(2) ์คํ : 1 3 2
09. second<-pop(2) first<-pop(3) push(first*second) ์คํ : 1 6
10. second<-pop(6) first<-pop(1) push(first+second) ์คํ : 7
๊ตฌํ์ ์ฐ์ฐ์๊ฐ ๋์์ ๋ pop์ ๋๋ฒํ ์ ์๋์ง์ ๊ฐ์ ์กฐ๊ฑด์ ๋ฐ์ ธ์ผํ๋ค.
#include <stdio.h>
#include "stack_list.h"
int check(char c, Stack **top){
int a,b;
if('0'<=c&& c<='9'){
push(top, c-'0');
}else{
a = peak(*top);
if(a==-1){
printf("ํผ์ฐ์ฐ์์ ์๊ฐ ๋ถ์กฑํฉ๋๋ค.\n");
return -1;
}
pop(top);
b = peak(*top);
if(b==-1){
printf("ํผ์ฐ์ฐ์์ ์๊ฐ ๋ถ์กฑํฉ๋๋ค.\n");
return -1;
}
pop(top);
if(c=='+'){
push(top, b+a);
}else if(c=='/'){
push(top, b/a);
}else if(c=='*'){
push(top, b*a);
}else if(c=='-'){
push(top, b-a);
}else{
push(top, b%a);
}
}
return peak(*top);
}
int main(int argc, const char * argv[]) {
Stack * head=NULL;
char c;
int result=0;
while ((c = getchar()) && c != EOF && c!='\n') {
result=check2(c,&head);
if(result==-1)break;
}
if(result!=-1)printf("%d\n",result);
else printf("์คํจ\n");
return 0;
}
์ค์ ํ๊ธฐ์ โ ํ์ ํ๊ธฐ์
์์์ ๊ฐ ์ฐ์ฐ์์ ๋ํด์ ์ฐ์ ์์์ ๋ฐ๋ผ ๊ดํธ๋ฅผ ์ฌ์ฉํ์ฌ ๋ค์ ํํํ๋ค. ((A*B)-(C/D))
๊ฐ ์ฐ์ฐ์๋ฅผ ๊ทธ์ ๋์ํ๋ ์ค๋ฅธ์ชฝ ๊ดํธ์ ๋ค๋ก ์ด๋์ํจ๋ค.((A B)* (C D)/)-
์๊ณ ๋ฆฌ์ฆ ๊ฐ์
์ผ์ชฝ ๊ดํธ๋ฅผ ๋ง๋๋ฉด ๋ฌด์
ํผ์ฐ์ฐ์๋ฅผ ๋ง๋๋ฉด ์ถ๋ ฅ
์ฐ์ฐ์๋ฅผ ๋ง๋๋ฉด ์คํ์ ์ฝ์
์ค๋ฅธ์ชฝ ๊ดํธ๋ฅผ ๋ง๋๋ฉด ์คํ pop
์์์ด ๋๋๋ฉด ์คํ์ด ๊ณต๋ฐฑ์ด ๋ ๋๊น์ง pop
#include <stdio.h>
#include "stack_array.h"
void convert(char c,StackType *s){
if(c=='(')return;
if('0'<=c&&c<='9')printf("%d",c-'0');
else if(c==')')printf("%c",pop(s));
else push(s, c);
}
int main(int argc, const char * argv[]) {
char c;
Stack s;
init(&s);
while ((c = getchar()) && c != EOF) {
if(c=='\n')break;
convert(c, &s);
}
while((&s)->top!=-1){
printf("%c",pop(&s));
}
return 0;
}