μλ£κ΅¬μ‘°
μ€νμ μ μ©
μμ³μ΄
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);
}