이 코드는 배열 기반 스택 구조를 C 언어로 구현한 예제입니다. 주요 기능은 다음과 같습니다:
#include <stdio.h>
#include <stdlib.h>
#define N 100
typedef struct StackType {
int top;
char stack[N];
} StackType;
void init(StackType* S) {
S->top = -1;
}
int isFull(StackType* S) {
return S->top == N - 1;
}
int isEmpty(StackType* S) {
return S->top == -1;
}
void push(StackType* S, char c) {
if (isFull(S))
printf("Overflow!\n");
else {
S->top++;
S->stack[S->top] = c;
}
}
char peek(StackType* S) {
if (isEmpty(S)) {
printf("Empty!\n");
return -1;
}
return S->stack[S->top];
}
char pop(StackType* S) {
if (isEmpty(S)) {
printf("Empty!\n");
return -1;
}
return S->stack[S->top--];
}
void print(StackType* S) {
for (int i = 0; i <= S->top; i++) {
printf("%c", S->stack[i]);
}
printf("\n");
}
// -------------------------------------------------------------
int main() {
StackType S;
init(&S);
push(&S, 'c');
push(&S, 'a');
push(&S, 't');
push(&S, 's');
print(&S); // 출력: cats
getchar(); // 엔터 대기 (디버깅용)
printf("After pop : %c\n", peek(&S)); // top에 있는 's' 출력
return 0;
}
cats
After pop : s
필요 시, 다양한 타입(Generic) 또는 동적 메모리 할당 기반으로 리팩터링할 수 있습니다.
스택 자료구조 정의 및 연산
StackType을 정의하고, push, pop, peek, isEmpty, isFull, print 등의 기본 스택 연산을 구현합니다.괄호 검사 기능 (check)
{}, 대괄호 [], 소괄호 ()의 짝이 맞는지 검사합니다.실행 흐름
char expr[N];
scanf("%s", expr);
if (check(expr))
printf("Success!\n");
else
printf("Fail\n");
예시 입력/출력
({[]}) → 출력: Success!({[}) → 출력: Fail#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define N 100
typedef struct StackType
{
int top;
char stack[N];
} StackType;
void init(StackType *S) {
S->top = -1;
}
int isFull(StackType* S) {
return S->top == N - 1;
}
int isEmpty(StackType* S) {
return S->top == -1;
}
void push(StackType* S, char c) {
if (isFull(S))
printf("Overflow!\n");
else {
S->top++;
S->stack[S->top] = c;
}
}
char peek(StackType* S) {
if (isEmpty(S)) {
printf("Empty!\n");
return -1;
}
return S->stack[S->top];
}
char pop(StackType* S) {
if (isEmpty(S)) {
printf("Empty!\n");
return -1;
}
return S->stack[S->top--];
}
void print(StackType* S) {
for (int i = 0; i <= S->top; i++) {
printf("%c", S->stack[i]);
}
printf("\n");
}
int check(char expr[]) {
StackType S;
init(&S);
char c, t;
int n = strlen(expr);
for (int i = 0; i < n; i++) {
c = expr[i];
if (c == '(' || c == '{' || c == '[')
push(&S, c);
else if (c == ')' || c == '}' || c == ']') {
if (isEmpty(&S))
return 0;
t = pop(&S);
if ((t == '(' && c != ')') ||
(t == '{' && c != '}') ||
(t == '[' && c != ']'))
return 0;
}
}
return isEmpty(&S);
}
int main() {
char expr[N];
scanf("%s", expr);
if (check(expr))
printf("Sucess!\n");
else
printf("Fail\n");
/* 디버그용 코드 (사용 안함)
StackType S;
init(&S);
push(&S, 'c');
push(&S, 'a');
push(&S, 't');
push(&S, 's');
print(&S);
getchar();
printf("After pop : %c\n", peek(&S));
*/
return 0;
}
이 코드는 C 언어로 구현된 후위 표기식 계산기로, 스택 구조를 이용해 수식을 처리합니다. 한 자리 숫자로 구성된 후위 표기식(예: 23+5*)을 입력받아 최종 계산 결과를 출력합니다.
typedef struct StackType {
int top;
char stack[N];
} StackType;
char형 사용)top은 현재 스택의 가장 위 인덱스를 의미함void init(StackType* S) {
S->top = -1;
}
int isFull(StackType* S) {
return S->top == N - 1;
}
int isEmpty(StackType* S) {
return S->top == -1;
}
void push(StackType* S, char c) {
if (isFull(S)) printf("Overflow!\n");
else S->stack[++S->top] = c;
}
char pop(StackType* S) {
if (isEmpty(S)) {
printf("Empty!\n");
return -1;
}
return S->stack[S->top--];
}
char peek(StackType* S) {
if (isEmpty(S)) {
printf("Empty!\n");
return -1;
}
return S->stack[S->top];
}
void print(StackType* S) {
for (int i = 0; i <= S->top; i++) {
printf("%c", S->stack[i]);
}
printf("\n");
}
int evaluate(char postfix[]) {
StackType S;
init(&S);
int op1, op2, value;
char c;
int n = strlen(postfix);
for (int i = 0; i < n; i++) {
c = postfix[i];
if (c != '+' && c != '-' && c != '*' && c != '/') {
value = c - '0'; // 문자 숫자를 정수로 변환
push(&S, value);
} else {
op2 = pop(&S);
op1 = pop(&S);
switch (c) {
case '+': push(&S, op1 + op2); break;
case '-': push(&S, op1 - op2); break;
case '*': push(&S, op1 * op2); break;
case '/': push(&S, op1 / op2); break;
}
}
}
return pop(&S);
}
입력: 23+5* (== (2+3)*5)
출력: 25
int main() {
char postfix[N];
scanf("%s", postfix);
printf("%d\n", evaluate(postfix));
return 0;
}
123+* → 해석 불가능 (문자 하나씩만 인식함)#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define N 100
typedef struct StackType {
int top;
char stack[N];
} StackType;
void init(StackType* S) {
S->top = -1;
}
int isFull(StackType* S) {
return S->top == N - 1;
}
int isEmpty(StackType* S) {
return S->top == -1;
}
void push(StackType* S, char c) {
if (isFull(S))
printf("Overflow!\n");
else {
S->top++;
S->stack[S->top] = c;
}
}
char peek(StackType* S) {
if (isEmpty(S)) {
printf("Empty!\n");
return -1;
}
return S->stack[S->top];
}
char pop(StackType* S) {
if (isEmpty(S)) {
printf("Empty!\n");
return -1;
}
return S->stack[S->top--];
}
void print(StackType* S) {
for (int i = 0; i <= S->top; i++) {
printf("%c", S->stack[i]);
}
printf("\n");
}
int evaluate(char postfix[]) {
StackType S;
init(&S);
int op1, op2, value;
char c;
int n = strlen(postfix);
for (int i = 0; i < n; i++) {
c = postfix[i];
if (c != '+' && c != '-' && c != '*' && c != '/') {
value = c - '0';
push(&S, value);
} else {
op2 = pop(&S);
op1 = pop(&S);
switch (c) {
case '+': push(&S, op1 + op2); break;
case '-': push(&S, op1 - op2); break;
case '*': push(&S, op1 * op2); break;
case '/': push(&S, op1 / op2); break;
}
}
}
return pop(&S);
}
int main() {
char postfix[N];
scanf("%s", postfix);
printf("%d\n", evaluate(postfix));
return 0;
}
이 코드는 후위 수식을 계산하는 스택 응용 예제로서, 컴파일러, 계산기, 수식 변환 알고리즘 등을 학습할 때 매우 유용한 구조입니다. 필요한 경우 여러 자리 숫자, 공백 구분 등을 처리하는 버전으로 확장 가능합니다.
스택 자료구조 정의 및 연산
StackType 구조체를 정의하고 push, pop, peek, isEmpty, isFull 등 기본 스택 연산을 구현함후위 표기식 계산 (evaluate)
23+5* → (2 + 3) * 5 → 25실행 흐름
char postfix[N];
scanf("%s", postfix);
printf("%d\n", evaluate(postfix));
evaluate() 함수로 계산 후 결과 출력제약 사항
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define N 100
typedef struct StackType {
int top;
char stack[N];
} StackType;
void init(StackType* S) {
S->top = -1;
}
int isFull(StackType* S) {
return S->top == N - 1;
}
int isEmpty(StackType* S) {
return S->top == -1;
}
void push(StackType* S, char c) {
if (isFull(S))
printf("Overflow!\n");
else {
S->top++;
S->stack[S->top] = c;
}
}
char peek(StackType* S) {
if (isEmpty(S)) {
printf("Empty!\n");
return -1;
}
return S->stack[S->top];
}
char pop(StackType* S) {
if (isEmpty(S)) {
printf("Empty!\n");
return -1;
}
return S->stack[S->top--];
}
void print(StackType* S) {
for (int i = 0; i <= S->top; i++) {
printf("%c", S->stack[i]);
}
printf("\n");
}
int evaluate(char postfix[]) {
StackType S;
init(&S);
int op1, op2, value;
char c;
int n = strlen(postfix);
for (int i = 0; i < n; i++) {
c = postfix[i];
if (c != '+' && c != '-' && c != '*' && c != '/') {
value = c - '0';
push(&S, value);
} else {
op2 = pop(&S);
op1 = pop(&S);
switch (c) {
case '+': push(&S, op1 + op2); break;
case '-': push(&S, op1 - op2); break;
case '*': push(&S, op1 * op2); break;
case '/': push(&S, op1 / op2); break;
}
}
}
return pop(&S);
}
int main() {
char postfix[N];
scanf("%s", postfix);
printf("%d\n", evaluate(postfix));
return 0;
}
입력:
23+5*
출력:
25
해석:
2 + 3 = 55 * 5 = 25"12 3 +") → strtok 또는 sscanf 활용float, double + 예외 처리 추가%, ^, etc)후위 표기식 계산기는 스택 자료구조의 대표적인 응용 사례로, 컴파일러, 계산기, 알고리즘 수업 등에서 자주 등장합니다.