2023/03/17 ~ 2023/03/23 3주차 공부

1. 리트머스:

230313UG

참고: 코드는 의미가 있어야 합니다!
!
매 수업 시간에 랜덤으로 코드를 설명하는 시간이니 과제 제출 후 발표 시간 전에 코드를 숙지하세요.

2. 개념 + 예시:

힘내 링크: https://github.com/St2usy/Data_Structure_Study_3_week.git

GitHub – St2usy/Data_Structure_Study_3_week

GitHub에서 계정을 생성하여 St2usy/Data_Structure_Study_3_week 개발에 기여하십시오.

github.com

바늘:

메모리의 모든 주소를 가리키는 변수입니다.

변수 크기는 4바이트(64비트 운영 체제의 경우 8바이트)로 고정됩니다.

포인터 변수 자체의 크기는 고정되어 있지만

정수*pt_int; 이러한 방식으로 int를 지정하는 이유는 포인터가 가리키는 메모리에 보관된 값의 유형이 int임을 나타내기 위해서입니다.

이중 포인터:

정수** pp_pt_int;

pp_pt_int = &pt_int;

위의 두 문장은 논리적으로 잘못된 문장입니다.

이중 포인터는 포인터에 대한 포인터입니다.

pt_int는 포인터 변수이므로 변수에 저장되는 값이 주소 값입니다.

이 경우 & 연산자는 포인터 변수의 메모리 주소를 참조하는 데 사용됩니다.

&pt_int의 타입이 int**가 되므로 pp_pt_int 값에 pt_int 값을 할당할 수 있다.

값에 의한 호출 / 참조에 의한 호출 / 포인터에 의한 호출:

함수의 매개 변수가 기본 변수, 참조 변수 또는 포인터 변수일 때 차이가 발생합니다.

기본 변수 -> 매개 변수 값이 복사되어 함수에 전달됩니다.

이때 원본과 사본이 구분되므로 사본의 값을 변경해도 원본의 값은 변경되지 않습니다.

참조 -> 매개변수 값은 참조의 형태로 함수에 전달됩니다.

원본과 참조가 가리키는 값은 같기 때문에 참조의 값을 변경하면 원본의 값도 변경됩니다.

포인터 변수 -> 유사 참조. 배열의 변수 이름을 전달해도 동일한 효과가 있습니다.

이는 배열의 변수명이 배열의 주소를 의미하기 때문입니다.

자체 참조 포인터:

동일한 클래스의 개체를 가리키는 멤버 변수 중 하나 이상의 포인터가 있는 클래스입니다.

특정 크기가 미리 할당된 배열과 달리 자기 참조 클래스가 정의되어 있고 요소의 개수를 미리 예측할 수 없는 경우 객체를 동적으로 생성하고 포인터로 연결하는 구조에서 자주 사용됩니다.

#pragma once
#include<string>
using std::string;

class Stack
{
	struct Node
	{
		Node* prev;
		string s;

		Node(Node* prev, string s)
			:prev(prev), s(s)
		{}
	};

	Node* current; // 최상위값

	Node start; // 최하위값

public:
	Stack();

	// 최상단에 새로운 원소를 추가한다.

void push(string s); // 최상단의 원소를 제거하고 반환한다.

string pop(); // 최상단의 원소를 반환한다.

(제거 안함) string peek(); // 스택이 비어있는지의 유무를 반환한다.

bool is_empty(); ~Stack(); };
#include "STACK_MADE.h"


Stack::Stack() 
    :start(NULL, "") 
{
    current = &start; 
}
void Stack::push(string s)
{
    Node* n = new Node(current, s);
    current = n;
}
string Stack::pop() 
{
    if (current == &start) // 최상단이 최하단과 같을때 <높이 1일때>
        return "";

    string s = current->s;
    Node* prev = current;
    current = current->prev;

    // Delete popped node
    delete prev;
    return s;
}
string Stack::peek() 
{ 
    return current->s; 
}
bool Stack::is_empty() 
{
    if (current == &start) return true;
    return false;
}
Stack::~Stack() 
{
    while (current !
= &start) { Node* prev = current; current = current->prev; delete prev; } }

동적 매핑:

정적 할당에 대한 반대 개념으로 표준 변수 또는 배열이 정적 할당에 의해 선언될 때 스택에 메모리가 할당됩니다.

동적 할당은 힙에 메모리를 할당합니다.

필요한 메모리 크기는 런타임에 할당되고 사용자가 수동으로 할당하고 수동으로 할당을 해제합니다.

즉, 배열의 크기

입력된 변수를 통해 설정할 수 있습니다.

또한 동적으로 할당된 배열은 포인터의 이름과 인덱스로 일반 배열처럼 쉽게 사용할 수 있습니다.

void main() {
	int arrA(20);
	int* arrB = new int(20);
	arrA(3) = 10;
	arrB(3) = 20;
	delete() arrB;
}

2차원 배열의 동적 할당:

결론을 말씀드리자면

int** arr2D = new int (행)(열); // 잘못된 코드입니다.

C++은 그런 편리한 기능을 제공하지 않습니다.

사전에 수동으로 행을 할당한 후

각 행에 열을 동적으로 할당해야 합니다.

즉, 루프를 실행하여 동적으로 행렬을 임의로 할당해야 합니다.


2023/03/17 ~ 2023/03/23 3주차 공부 1
2차원 배열의 동적 할당

연결된 목록:

연결된 표현은 데이터와 링크로 구성되며 링크는 노드를 연결하는 역할을 합니다.

그러나 배열을 사용하기 때문에 데이터를 한 위치에 국한할 수 없습니다.

데이터가 무작위로 흩어져 있지만 링크를 사용하여 하나씩 추적하여 저장 공간을 확인할 수 있습니다.

연결 목록은 물리적으로 분산된 데이터(메모리에 무작위로 분산됨)를 연결하고 해당 데이터를 단일 데이터로 그룹화하는 방법입니다.

1. 크기의 가변성

2. 간편한 메모리 삽입 및 삭제

노드, 헤드 포인터