스택을 이용한 정리 문제입니다

조회수 474회
#define _CRT_SECURE_NO_WARNINGS
#include <cstdio>
#include <iostream>
#include <algorithm>

using namespace std;

template <class T>
void ChangeSize(T* &a, const int oldSize, const int newSize) {
    if (newSize < 0) throw "New length must be >= 0";

    T* temp = new T[newSize];
    int num = min(oldSize, newSize);
    copy(a, a + num, temp);
    delete[] a;
    a = temp;
}

class Stack {
public :
    Stack(int stackCapacity = 80) {
        capacity = stackCapacity;
        stack = new char[capacity];
        top = -1;
    }; //크기가 80인 공백 스택을 생성(80자까지만 입력받기 위해서)

    inline bool IsEmpty() const { return top == -1; }

    inline char& Top() const {
        if (IsEmpty()) throw "Stack is empty.";
        return stack[top];
    }

    void Push(const char& x) {
        if (top == capacity - 1) {
            ChangeSize(stack, capacity, capacity * 2);
            capacity *= 2;
        }
        stack[++top] = x;
    }

    void Pop() {
        if (IsEmpty()) throw "Stack is empty, cannot delete.";
        stack[top--] = NULL;
    }

    void ShowStack() {
        printf("%s", stack);
    }

private :
    char* stack;
    int top;
    int capacity;
};

void main() {
    Stack s;
    char input[1000];
    int i = 0;
    bool check = false;
    printf("식을 입력 : ");
    scanf("%s", input);
    for (i; input[i] =! '#'; i++) {
        if (input[i] == '(' || input[i] == '[' || input[i] == '{' || input[i] == '<') s.Push(input[i]);
        else if (input[i] == ')' || input[i] == ']' || input[i] == '}' || input[i] == '>') {
            check = false;
            switch (s.Top()) {
            case '(': if (input[i] == ')') check = true; break;
            case '[': if (input[i] == ']') check = true; break;
            case '{' : if (input[i] == '}') check = true; break;
            case '<' : if (input[i] == '>') check = true; break;
            }
            if (check) s.Push(input[i]);
            else break;
        }
    }
    if (check) { 
        input[i] = NULL;
        printf("Correct! %s", input); 
    }
    else {
        printf("Error : ");
        for (int j = 0; j <= i; j++) {
            printf("%c", input[j]);
        }
        printf("\nStack : ");
        s.ShowStack();
    }
}

80자 이하의 식을 입력받아 괄호의 쌍이 정확히 매칭되는지를 스택을 이용해 확인하는 코드 입니다.

정확한 수식의 예 : (a + [b - <c>*<d>+{e-f}]-(g+h)) #  
잘못된 수식의 예 : (a + [b +c) * d ] #

정확한 수식이 입력이 된다면 입력받은 식을 그대로 출력하고 잘못된 수식이 입력이 된다면 그 시점의 스택 내용과 현재까지 처리한 입력 수식을 출력하게 됩니다. 입력받는 데 까지는 아무런 문제가 없지만 입력을 받으니 정확한 값을 입력해도, 잘못된 값을 입력해도 Error : Stack : (쓰레기값) 이 출력이 됩니다. 문제가 무엇인지 감도 안잡힙니다. 배열을 초기화를 해봐도 달라지지않고요. 혹시 클래스 내의 동적 메모리 할당으로 만든 배열도 초기화를 해야 하는 것인가요? 쓰레기값이 출력되는 것과 정확한 값이 입력되던 잘못된 값이 입력되던 Error과 Stack을 보여 주는것, 이 두 가지가 큰 문제인 것 같습니다.

  • (•́ ✖ •̀)
    알 수 없는 사용자
  • Pop 을 해야할 곳에서 Push를 하고 있는것 같아요. toyseed 2021.4.12 14:54

답변을 하려면 로그인이 필요합니다.

프로그래머스 커뮤니티는 개발자들을 위한 Q&A 서비스입니다. 로그인해야 답변을 작성하실 수 있습니다.

(ಠ_ಠ)
(ಠ‿ಠ)