자료ꡬ쑰

μŠ€νƒμ˜ 적용

μ•„μ˜³μ΄ 2021. 8. 18. 16:34

이전 ν¬μŠ€νŠΈμ—μ„œ μ‚¬μš©ν•œ linkedStack 을 μ΄μš©ν•œ ν—€λ”νŒŒμΌ

#ifndef _LINKEDSTACK_
#define _LINKEDSTACK_

typedef struct LinkedStackNodetype {
	char data;
	struct LinkedStackNodetype *pLink;		//링크
}	LinkedStackNode;

typedef struct LinkedStacktype {
	int currentCount;
	LinkedStackNode *pTop;				// 탑 λ…Έλ“œμ˜ 포인터
}	LinkedStack;

LinkedStack	*createLinkedStack(void);
int	pushLS(LinkedStack *pStack, char data);
int	isLinkedStackEmpty(LinkedStack *pStack);
LinkedStackNode *popLS(LinkedStack *pStack);
LinkedStackNode *peekLS(LinkedStack *pStack);
void	deleteLinkedStack(LinkedStack *pStack);
void	displayLinkedStack(LinkedStack *pStack);

#endif

을 μ‚¬μš©ν•˜μ—¬ κ°„λ‹¨ν•œ 예제λ₯Ό λ§Œλ“€μ–΄λ³΄μž

 

1. μ—­μˆœμΈ λ¬Έμžμ—΄ λ§Œλ“€κΈ°

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

char	*reverseString(char *pSource)
{
	char	*pReturn = NULL;
	int	i = 0, size = 0;
	LinkedStack	*pStack = NULL;
	LinkedStackNode	*pNode = NULL;

	pStack = createLinkedStack();
	if (pStack != NULL)
	{
		while (pSource[size] != 0)
		{
			pushLS(pStack, pSource[size]);
			size++;
		}

		pReturn = (char *)malloc(sizeof(char) * (size + 1));
		memset(pReturn, 0, sizeof(char) * (size + 1));
		while (i < size)
		{
			pNode = popLS(pStack);
			if (pNode != NULL)
			{
				pReturn[i] = pNode->data;
				free(pNode);			// pop된 λ…Έλ“œμ— λ…Έλ“œμ— λŒ€ν•œ λ©”λͺ¨λ¦¬ ν•΄μ œ
			}
			i++;
		}
		deleteLinkedStack(pStack);
	}

	return (pReturn);
}

int	main(void)
{
	char	szSource[] = "ABCD";
	char	*pszReverse = reverseString(szSource);

	if (pszReverse != NULL)
	{
		printf("[%s]=> [%s]\n", szSource, pszReverse);

		free(pszReverse);				// ν•¨μˆ˜ 호좜 결과둜 전달받은 λ¬Έμžμ—΄ λ©”λͺ¨λ¦¬  ν•΄μ œ
	}

	return (0);
}

 

2. μˆ˜μ‹μ—μ„œ κ΄„ν˜Έ κ²€μ‚¬ν•˜κΈ°

#include <stdio.h>
#include <stdlib.h>
#include "linkedstack.h"

int	checkBracketMatching(char *pSource)
{
	int	ret = 0, i = 0;
	char symbol = '\0', checkSymbol = '\0';
	LinkedStack	*pStack = NULL;
	LinkedStackNode	*pNode = NULL;

	pStack = createLinkedStack();
	if (pStack != NULL)
	{
		while (pSource[i] != 0 && ret == 0)
		{
			symbol = pSource[i];
			switch (symbol)
			{
				case '(':
				case '[':
				case '{':
					pushLS(pStack, symbol);		// μ—¬λŠ” κ΄„ν˜Έ λ§Œλ‚˜λ©΄ push
					break;
				case ')':
				case ']':
				case '}':
					pNode = popLS(pStack);		// λ‹«λŠ” κ΄„ν˜Έ λ§Œλ‚˜λ©΄ pop
					if (pNode == NULL)			// λ‹«λŠ” κ΄„ν˜Έκ°€ 더 λ§Žμ€ 경우
						ret = 1;
					else
					{
						checkSymbol = pNode->data;			// λ§ˆμ§€λ§‰ μ—¬λŠ” κ΄„ν˜Έμ™€ 첫번째 λ‹«λŠ” κ΄„ν˜Έ 비ꡐ
						if ((symbol == ')' && checkSymbol == '(')
							|| (symbol == ']' && checkSymbol == '[')
							|| (symbol == '}' && checkSymbol == '{'))
								ret = 0;
						else					// κ΄„ν˜Έμ˜ 쌍이 λ§žμ§€ μ•Šμ„ 경우
							ret = 2;
					}
					free(pNode);
					break;
			}
			i++;
		}

		if (ret == 0 && isLinkedStackEmpty(pStack) == 0)	// μ—¬λŠ” κ΄„ν˜Έκ°€ 더 λ§Žμ€ 경우
			ret = 3;

		deleteLinkedStack(pStack);
	}

	return (ret);
}

int main(void)
{
	int		checkResult = 0, i = 0;
	char	szExpresstionStr[][50] = {
		"( A + B ) * C",
		"{ ( A + B ) * C } * D",
		"( A + B ) * C )",			// μ—¬λŠ” κ΄„ν˜Έ λΆ€μ‘±
		"( ( A + B ) * C", 			// λ‹«λŠ” κ΄„ν˜Έ λΆ€μ‘±
		"{ ( A + B } ) * C * D"		// κ΄„ν˜Έ λ¬Έμžκ°€ λ§žμ§€ μ•ŠμŒ
	};

	for (i = 0; i < sizeof(szExpresstionStr) / sizeof(szExpresstionStr[0]); i++)
	{
		checkResult = checkBracketMatching(szExpresstionStr[i]);
		if (checkResult == 0)
			printf("SUCCESS, %s\n", szExpresstionStr[i]);
		else
			printf("FAIL-[%d], %s\n", checkResult, szExpresstionStr[i]);
	}

	return (0);
}