본문 바로가기

자료구조

(26)
Queue - 배열 구현 Queue를 배열로 구현 해보자. 이전 RTOS Study에서 Queue를 구현 해 보고 공부 해 본적 있으니 설명은 링크 참고 kjt9109.tistory.com/entry/%EC%9E%84%EB%B2%A0%EB%94%94%EB%93%9C-OS-%EA%B0%9C%EB%B0%9C-%ED%94%84%EB%A1%9C%EC%A0%9D%ED%8A%B8-15%EB%A9%94%EC%84%B8%EC%A7%95 임베디드 OS 개발 프로젝트 15(메시징) http://www.yes24.com/Product/Goods/84909414. ├── boot │ ├── Entry.S │ ├── Handler.c │ ├── Main.c │ └── main.h ├── hal │ ├── HalInterrupt.h.. kjt9109.t..
Stack - 후위표기법 -1(계산) 구현 된 후위표기법으로 이제 계산을 해보자 이전글에서 변환한 후위표현 식은 다음과 같다. "51 8 3 4 * 4 - / - 20 -" 계산 방법은 다음과 같다. 1. 앞에서부터 SCAN 하면서 연산기호를 찾는다. 2. 연산 기호 앞에 2개의 숫자를 기호에 맞게 계산한다. 3. 다시 Stack에 집어 넣는다. 4. 연산 기호가 없을 때 까지 계산한다. 함수는 다음과 같다. int Postfix_Calc(int *char_arr, int length) { int index; int result; int operator_0; int operator_1; Stack LStack, NStack; StackInit(&LStack); StackInit(&NStack); /* 배열의 index 크기를 구한다. */ ..
Stack - 후위표기법 -1(변환) C에서 후위표기법으로 바꿔 보자 공식을 String을 쓰고 쓴 String을 INT로 바꾼다. 바꾸는 함수는 다음과 같다. STRtoINT함수 /* ASCII 값을 INT형으로 변경한다. */ int STRtoINT(char *char_arr, int *local_arr) { int num = 0; int arr = 0; int int_len = 0; while (*char_arr != '\0') { if (*char_arr > '0' && *char_arr = calc_op_check(char_arr[arr]) && calc_op_check(char_arr[arr]) != 1) { /*연산 스택에서 제거 후 일반 배열에 넣는다. */ calc_array[index++] = SPop(&Calc_Stack..
Stack - 중위표기법 (괄호 x) Stack을 활용해 중위계산법을 구현해보자 중위계산법은 그냥 우리가 생각하는 일반적인 방법이다. 검증 할 식 ex) 10 * 5 - 8 / 4 + 2 * 3 계산을 하기 위해 Stack에 쌓아보자 여기서 구현 할때 String문자를 10진수 변환 하기 위해 strtoul 함수를 사용했다 strtoul을 사용하여 10진수를 바꿔보면 + 부호 - 부호는 같이 묶여서 나타난다. 즉 부호는 * / 만 존재한다. 다음 식을 Stack에 담아 보자 ex) 10 + 9 * 5 * -2 / 1 + 2 * 3 식을 계산 할려면 왼쪽에서 오른쪽으로 읽어가면서 곱셈, 나눗셈이 있는지 확인 해야 하는데 Stack Pointer는 반대 쪽에 위치하고 있다 옮겨 주자 끝까지 옮기면 다음과 같은 그림이 완성 된다. 그림 같이 함수..
STACK 구현 스택은 예전에 Assembly 공부하면서 Study 함 참조 링크: kjt9109.tistory.com/entry/5%EC%9E%A5%ED%94%84%EB%A1%9C%EC%8B%9C%EC%A0%80?category=825870 바로 소스로 들어가자 STACK API #define STACK_SIZE 50 typedef int Data; typedef struct __Stack { int buf[STACK_SIZE]; int stack_ptr; } Stack; void StackInit(Stack *pstack); void Show_Stack(Stack *pstack); void SPush(Stack *pstack, Data data); int sIsEmpty(Stack *pstack); Data SPop..
연결리스트 #2 리스트 추가기능 연결리스트 #1에서 구현한 리스트에서 추가하고 싶은 위치에 리스트를 추가해보자. 예시 리스트에서 내가 원하는 index에 추가를 하고자 할려면 각 리스트 구조체마다 index number가 필요하다 따라서 다음과 같이 구조체에 index_num을 추가한다. typedef struct __LinkedList { char data[50]; int index_num; struct __LinkedList *next; }LinkedList; 또한 기존에 List를 Malloc으로 생성 후 RecvData를 저장 했던 작업에서 index_num역시 추가해준다. { BODY = (LinkedList*) malloc(sizeof(LinkedList)); strcpy(BODY->data, RecvData); BODY->..
연결 리스트 #1 구현 연결리스트를 구현해보자 연결리스트를 그림으로 그리면 다음과 같다. 이런 느낌인데 실제 코드를 구현하기 위해 다음과 같이 보충 후 코딩하였다. TAIL에 들어가는 조건은 String으로 입력이 Finish로 들어왔을 시 TAIL에 저장이 되고 HEAD는 첫 데이터 입력시에만 저장된다. LinkedList의 구조체는 다음과 같다. typedef struct __LinkedList { char data[50]; struct __LinkedList *next; }LinkedList; data버퍼는 String 값을 저장하고 Next는 다음 LinkedList의 구조체를 나타낸다. LinkedList를 만들기 위해 HEAD, BODY, TAIL이 필요하고 각각 HEAD, BODY, TAIL을 연결해주기 위한 Li..
배열 리스트 리스트의 의미는 다음과 같다 순차 리스트 : 배열을 기반으로 구현된 리스트 연결 리스트 : 메모리의 동적 할당을 기반으로 구현된 리스트 배열리스트를 구현해보자 책(윤성우의 열혈 자료구조)에서 제공하는 배열 리스트의 자료구조 ADT는 다음과 같다. Operations: void ListInit(List * plist); - 초기화할 리스트의 주소 값을 인자로 전달한다. - 리스트 생성 후 제일먼저 호출되어야하는 함수이다. void LInsert(List * plist , LData data); - 첫 번째 데이터가 pdata 가 가리키는 메모리에 저장된다. - 데이터의 참조를 위한 초기화가 진행된다. - 참조 성공시 TRUE(1), 실패 시 FALSE(0) 반환 void LNext(List * plist,..