Demo entry 6646247

Stack

   

Submitted by anonymous on Oct 16, 2017 at 06:54
Language: C. Code size: 2.4 kB.

/*
공학 프로그래밍 HW #2
Stack에 대한 ADT 작성 by C
기본적인 구조는 C로 구현하기 때문에
procedure 형태로 코딩할 것.

필요한 함수는 
create_stack : stack 배열을 만드는 함수
isFull		 : stack 의 공간이 차있을때,
isempty		 : stack 에 data가 없을 때,
push		 : stack 에 data를 input
pop			 : stack 에 data를 out,
이다.
*/

#include <stdio.h>
#include <stdlib.h>
#define MAX_SIZE 10		//stack 의 크기 = 10

typedef struct {
	int top;
	int data[MAX_SIZE];
}Stack;				// typedef로 stack 선언

Stack createStack()
{
	/* stack을 만든다.*/
	Stack s;
	s.top = -1;		// top = -1 이면 empty 상태, top+1 자리는 Data가 들어갈 자리이다.
	return s;		// top = -1 상태인 stack의 pointer를 반환한다.
}
void isEmpty()
{
	/* stack 내부에 data가 없을 시 error 를 출력한다.*/
	fprintf(stderr, "Stack is empty\n");
}
void isFull()
{
	/* stack 내부에 data가 가득 차있을 때 error 를 출력한다.*/
	fprintf(stderr, "Stack is Full\n");
}
void push(Stack *s, int input_data)
{
	/* stack에 input data를 삽입한다.
	Data가 full일시 error 반환*/
	if ((*s).top >= 9){
		isFull();
		return;
	}
	(*s).data[++(*s).top] = input_data;
}
int pop(Stack *s)
{
	/* Stack에서 top에 있는 data를 출력하여 반환한다.
	그리고 top의 위치를 한칸 내린다.*/
	return (*s).data[(*s).top--];
}
void printStack(Stack* s)
{
	/* 스택에 저장되어있는 값들을 표시한다.*/
	int i;
	if ((*s).top == -1){
		isEmpty();
		return;
	}
	printf_s("Top =>\t");
	for (i = (*s).top; i >= 0; i--){
		printf_s("%5d", (*s).data[i]);
	}
	printf_s("\n");
}
FILE* FileRead(char filename[], char mode[])
{
	FILE* fp = NULL;
	fopen_s(&fp, filename, mode);
	if (!fp){
		fprintf(stderr, "File Open Error\n");
		exit(EXIT_FAILURE);
	}
	return fp;
}
void printPop(Stack *s)
{
	/* stack에서의 출력된 값을 모니터에 출력한다.*/
	int data;
	if ((*s).top == -1){
		isEmpty();
		return;
	}
	data = pop(s);
	printf_s("출력된 값 = %d\n", data);
}


int main()
{
	int data;
	char operation;
	FILE* fp = FileRead("data.txt", "r");
	Stack s = createStack();						
	Stack* sp = &s;									// sp는 Stack의 top과 data에 대한 주소를 담은 포인터
	
	while (fscanf_s(fp, "%c", &operation) != -1)	// fp 포인터를 통해 file이 끝날때까지 문자를 scan한다.
	{
		switch (operation){
		case 'I':								//stack 에 data input
			fscanf_s(fp, "%d", &data);
			push(sp, data);
			printStack(sp);
			printf_s("\n");
			break;
		case 'O':								//stack에 data output
			printPop(sp);
			printStack(sp);
			printf_s("\n");
			break;
		default:
			break;
		}
	}

	fclose(fp);
	return 0;
}

This snippet took 0.01 seconds to highlight.

Back to the Entry List or Home.

Delete this entry (admin only).