C++ 자료구조론(이석호)

[C++ Fundamentals of Data Structures/C++ 자료구조론(이석호)] 3.2 스택 추상 데이타 타입 연습문제

ShuYan 2023. 9. 27. 22:50

1. 다음과 같은 함수를 첨가해서 스택 ADT를 확장하라: 스택을 출력하는 함수, 스택을 두 개의 스택으로 분할해서 하나는 밑으로부터 반을, 또 다른 하나는 나머지 원소를 포함하는 함수, 두 개의 함수를 하나로 합병하여 두 번째 스택에 있는 모든 원소를 첫 번째 스택의 톱에 설치하는 함수. 이 새로운 함수의 C++ 코드를 작성하라.

 

#include <iostream>
#include <algorithm>
using namespace std;

template <class T>

class Stack {
private:
	T* stack;
	int top;
	int capacity;

public:
	Stack(int stackCapacity = 10) : capacity(stackCapacity) {
		if (capacity < 1)
			throw "Stack capacity must be > 0";
		stack = new T[capacity];
		top = -1;
	}

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

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

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

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

	void Push(const T& item) {
		if (top == capacity - 1) {
			ChangeSize1D(stack, capacity, capacity * 2);
			capacity *= 2;
		}
		stack[++top] = item;
	}

	void Pop() {
		if (IsEmpty())
			throw "Stack is empty. Cannot delete.";
		stack[top--].~T();
	}

	void Print() { //스택을 출력하는 함수
		cout << "stack의 원소 출력" << endl;
		for (int i = top; i >= 0; i--)
			cout << "stack " << i << " : " << stack[i] << endl;
	}

};

int main() {
	Stack<int> intStack;
	int i = 0;
	int k;
	cout << "스택에 Push할 원소의 개수 : ";
	cin >> k;

	cout << endl;
	for (i = 0; i < k; i++) {
		int n;
		cout << "스택에 Push할 원소 입력 : ";
		cin >> n;
		intStack.Push(n);
	}
	cout <<endl << "현재 스택의 top : " << intStack.Top() << endl << endl;
	intStack.Print();
		
}

 

//출력 결과

 

* 스택을 반으로 분할 하는 그 문제는 문제를 이해 못 햇음 ㅠ 생략 ~..