자료구조와 알고리즘/자료구조
-
스택의 활용 - 계산기 프로그램자료구조와 알고리즘/자료구조 2023. 5. 13. 10:26
스택을 활용해서 계산기를 만드는 연습문제이다. 중위표기식 -> 후위표기식 -> 후위표기식 계산 순서로 이루어진다. 먼저 중위표기식을 후위표기식으로 고쳐보자 1. 중위 to 후위 헤더 #ifndef __PostFix_h #define __PostFix_h void ConvertRPN(char exp[]); #endif 소스 #include "Postfix.h" #include #include "CStack.h" #include #include int PrecOP(char op1, char op2){ int op1_n = GetOp(op1); int op2_n = GetOp(op2); if(op1_n == -1 || op2_n == -1){ printf("에러"); exit(-1); } if(op1_n > ..
-
Stack - 배열,연결리스트,원형연결리스트자료구조와 알고리즘/자료구조 2023. 5. 4. 11:33
- 스택은 데이터를 한 쪽 끝에서만 넣거나 뺄 수 있는 자료구조이다. -장/단점 장점: 구현이 쉽다, 데이터 저장 및 읽기 속도가 빠르다. 단점: 저장 공간 낭비, 데이터의 최대 갯수를 미리 지정해야함 *이는 스택의 장점을 최대한 활용하기 위해 배열기반으로 스택이 구현 되므로 발생하는 단점이다. -활용 컴퓨터 프로그램에서 함수를 부를 때 스택을 사용한다 > 순차적으로 읽으며, 가장 먼저 호출됨 함수가 가장 먼저 실행 > 위와 같이 함수 정보를 저장하는 스택을 콜스택이라고 함 재귀함수 또한 가장 마지막에 호출된 함수를 가장 먼저 실행하므로 스택의 구조로 구현된다고 볼 수 있다. -구현 >배열 기반 스택 헤더 #ifndef _St_Array #define _St_Array #define MAX_DATA 10..
-
LinkedList(3) - 양방향 연결리스트자료구조와 알고리즘/자료구조 2023. 5. 2. 18:16
양방향 연결리스트는 노드에 양쪽을 연결해서 previous(이전) next(다음)을 통해 이동할 수 있는 리스트의 형태이다. 이전 노드를 가리키는 변수의 추가로 before를 통해 이전 노드를 기억해야하는 과정을 뺄 수 있다. 이전에 연결리스트 node에 previous를 가리킬 수 있는 변수만 추가해주면 된다. -ADT 이전과 동일 단, 노드를 구현하는 부분 이전 노드를 가리키는 pre가 추가됨 typedef struct _node{ Ldata data; struct _node* next; struct _node* pre; }node; -C 구현 (dummy기반 x) >헤더파일 #ifndef _DB_LINKED_LIST #define _DB_LINKED_LIST typedef int Ldata; typ..
-
LinkedList(3) 원형연결리스트자료구조와 알고리즘/자료구조 2023. 5. 2. 14:49
원형 연결리스트란, 리스트의 끝과 처음이 연결되어 참조하는 형식의 연결리스트를 말한다. 위 그림과 같이 연결의 형태가 원을 이루는 것을 원형연결리스트라고 부른다. 기존 연결리스트에서 head대신 tail을 사용하고 tail->next가 첫번째 노드를 가리키게 하면 된다. -ADT ADT는 크게 달라진 것이 없다. void Linsert --> 새 노드를 뒤에 추가 void LFinsert --->새 노드 처음에 추가 void Linit int LFirst int Lnext Ldata LRemove int Lcount - C언어 구현 헤더 #ifndef Circular_LinkedList #define Circular_LinkedList #define false 0 #define true 1 typedef..
-
LinkedList(2) - ADT와 구현자료구조와 알고리즘/자료구조 2023. 5. 1. 21:35
1 . ADT - 단순하게 데이터가 한쪽 방향으로 저장되고, 시작과 끝이 분명한 LinkedList를 구현해 보도록 하자. - 더미노드 기반으로 head만 존재한다. - ADT는 배열기반 연결리스트와 크게 차이가 없다. (정렬 추가) void Listinit(List * plist) > 리스트 초기화 void LInsert(List* plist, Ldata data) >리스트에 데이터를 추가 int LFirst(List* plist, Ldata* data) > 리스트에 저장된 데이터 참조를 위함 int LNext(List* plist, Ldata* data) > 리스트 저장된 데이터 참조 Ldata Lremove(List* plist) >리스트에 저장된 데이터 삭제 int Lcount(List* plis..
-
LinkedList (1)자료구조와 알고리즘/자료구조 2023. 5. 1. 17:18
데이터를 동적으로 할당하는 linkedList에 대해서 알아보기 전에 간단하게 그 컨셉에 대해 구현해보았다. #include #include typedef struct _node{ int data; struct _node* next; }node; int main(){ node* head =NULL; node* tail =NULL; node* cur =NULL; node* newnode = NULL; int readData; //데이터 읽기 while(1){ printf("자연수를 입력 하시오 종료하려면 0 입력"); scanf("%d",&readData); if(readDatadata =readData; newnode->next = NULL; if(head==NULL){ head=newnode; } el..
-
배열 기반 List (C and java)자료구조와 알고리즘/자료구조 2023. 3. 10. 16:46
자료구조의 첫 걸음인 배열기반 리스트를 구현해 보았다. 추상자료형(ADT) -구현하고자 하는 자료구조에 대해 구체적인 기능의 완성과정을 언급하지 않고, 순수하게 기능이 무엇인지를 나열 한 것을 가리켜 추상자료형 ADT라고 한다. 특정 자료형의 내부 구현은 정확하게 알지 못해도 활용할 수 있도록 명시하는 작업이라고 생각해 볼 수 있다. (마치 자바에서 인터페이스 혹은 추상 클래스를 정의하는 것과 비슷한 느낌이다.) 자료구조를 공부할 때 1. ADT를 정의하고 2. ADT를 근거로 자료구조를 활용하는 함수를 정의하고 3. ADT를 근거로 구현하는 과정 위 3단계 과정이 필요하다. 배열을 이용한 LIST 자료형의 구현 리스트는 간단하게 말해서 저장순서를 유지하고, 중복을 허용하여 자료를 저장하는 구조이다. 1..
-
재귀자료구조와 알고리즘/자료구조 2023. 3. 2. 10:05
1. 함수의 재귀적 호출 함수의 재귀적 호출이란, 함수 내에서 자기 자신을 다시 호출하는 것 간단하게 이해하는 방향은 하나의 함수는 원본이 있고, 재귀호출이 발생하면, 복사본이 만들어져서 호출한다고 생각해보자. 간단한 예제를 통한 재귀 호출의 흐름 Num 3으로 시작해서 조건 검사 -> true면 호출종료, false면 num=2로 recursive 재호출 -> 종료조건 만족 시, recursive (0) 반환 -> recursive(1)반환 -> recursive(3)반환 순서로 이어진다. *재귀함수는 탈출조건이 필요하다. * recursive호출을 기준으로 위 문장은 최종 반환 전 모든 함수가 반복하는 것, recursive 후는 탈출조건 만족 후 함수가 반환을 시작하면서 반복할 문장 예제2 팩토리얼..