C

[C] 264 스택구현

qkrwngus 2021. 2. 17. 19:06

Desc :

자료를 저장하기 위해 사용되는 알고리즘 중 하나  - 스택

Last-In-First-Out

맨 나중에 저장한 데이터가 가장 먼저 나옴

 

 


Source Code :

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

int push(int value);	// 데이터 삽입
int pop(int *value);	// 데이터 꺼내기

#define STACK_MAX 100	// 스택의 최대 크기

typedef struct tagStack	// 스택 구조체 선언
{
	int array[STACK_MAX];
	int top;
	int bottom;
}STACK;

STACK s;

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

	s.top = -1;

	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 (push(value1) == STACK_MAX)
		{
			puts("더 이상 저장할 수 없습니다.");	// overflow
		}

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

	value1 = 0;

	for (;;)
	{
		if (pop(&value2) == -1) break;	// underflow

		value1 += value2;
	}

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

int push(int value)
{
	if (s.top == STACK_MAX) return -1;	// 삽입 할 수 없음
	s.array[++s.top] = value;
	return 0;
}

int pop(int *value)
{
	if (s.top == -1) return -1; // 꺼낼 값이 없음
	*value = s.array[s.top--];
	return 0;
}

 


Result :