๐Ÿ’ก

์Šคํƒ์˜ ์ ์šฉ ๋ณธ๋ฌธ

์ž๋ฃŒ๊ตฌ์กฐ

์Šคํƒ์˜ ์ ์šฉ

์•„์˜ณ์ด 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);
}