C

[C] 265 큐 구현

qkrwngus 2021. 2. 17. 19:18

Desc :

 


Source Code :

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

int add(int value);
int delete(int *value);

#define QUEUE_MAX 100

typedef struct tagStack
{
	int array[QUEUE_MAX];
	int front;
	int rear;
}QUEUE;

QUEUE q;

void main()
{
	char buff[100], tmp[100];
	char *op = "+-*/%";
	int index;
	int value1 = 0, value2 = 0;

	q.front = 0;
	q.rear = 0;

	puts("계산식을 1*2처럼 입력하고 엔터키를 치세요.");
	puts("아무것도 입력하지 않으면 계산이 종료됩니다.");

	for (;;)
	{
		printf("계산식: ");
		gets(buff);

		if (strlen(buff) == 0) break; // 무한루프 종료

		memset(tmp, 0, sizeof(tmp));	// tmp버퍼 NULL값으로 채우기 --> atoi함수에서 문자열 끝 확인

		index = strcspn(buff, op);	// 연산자가 있는 위치 반환

		memcpy(tmp, buff, index);	// tmp에 buff를 index 크기만큼 복사

		value1 = atoi(tmp);
		value2 = atoi(&buff[index + 1]);	// index다음부터 문자열을 정수로 변환

		switch (buff[index])
		{
		case'+':
			value1 += value2;
			break;
		case'-':
			value1 -= value2;
			break;
		case'*':
			value1 *= value2;
			break;
		case'/':
			value1 /= value2;
			break;
		case'%':
			value1 %= value2;
			break;
		default:
			puts("잘못된 연산자를 사용하였습니다.");
			continue;
		}

		if (add(value1) == -1)
		{
			puts("더 이상 추가할 수 없습니다.");	// overflow
		}

		printf("%s = %d, q.rear = %d \n\n", buff, value1, q.rear);
	}

	value1 = 0;

	// add종료, 큐에 있는 데이터 꺼내는 무한루프
	for (;;)
	{
		if (delete(&value2) == -1) break;	// 값 꺼내서 value2의 포인터에 저장

		value1 += value2;
	}

	printf("계산의 총합은 %d입니다.\n", value1);
}

int add(int value)
{
	if (q.rear == QUEUE_MAX) return -1;
	q.array[q.rear++] = value;
	return 0;
}

int delete(int *value)
{
	if (q.front == q.rear || q.front == QUEUE_MAX) return -1; // empty 상태
	*value = q.array[q.front++];
	return 0;
}

 


Result :