C++고수님들.. C초보입니다.. 이해하기쉽게 주석좀 부탁드릴게요..

lminl23의 이미지

#include"stdio.h"
#define MAX_STACK_SIZE 100 // 스택최대크기
#define MAX_EXPR_SIZE 100 // 수식최대크기

void postfix(void);
int cal(void);
typedef enum {lparen, rparen, plus, minus, times, divide, mod, eos, operand} precedence;
int stack[MAX_STACK_SIZE];
char iexpr[MAX_EXPR_SIZE];
char pexpr[MAX_EXPR_SIZE];
int isp[]={0, 19, 12, 12, 13, 13, 13, 0};
int icp[]={20, 19, 12, 12, 13, 13, 13, 0};

main()
{
printf("Input the expression : ");
gets(iexpr);
postfix();
puts(pexpr);
printf("Evaluation Value : %d\n", cal());
}

int delete(int *top)
{
int token;

if (*top == -1) {
printf("Stack is empty. \n");
exit(1);
}
token = stack[(*top)]; (*top)--; return token;
// return stack[(*top)--];
}

void add(int *top, int item)
{
if (*top >= MAX_STACK_SIZE-1) {
printf("Stack is full. \n");
exit(1);
}

++(*top); stack[*top] = item;
// stack[++*top] = item;
}

void print_token(precedence token, int *p)
{
if (token == plus) pexpr[(*p)++]='+';
else if (token == minus) pexpr[(*p)++]='-';
else if (token == times) pexpr[(*p)++]='*';
else if (token == divide) pexpr[(*p)++]='/';
else if (token == mod) pexpr[(*p)++]='%';
}

precedence get_token(char expr[], char *symbol, int *n)
{
*symbol = expr[(*n)++];
switch (*symbol) {
case '(' : return lparen;
case ')' : return rparen;
case '+' : return plus;
case '-' : return minus;
case '*' : return times;
case '/' : return divide;
case '%' : return mod;
case '\0' : return eos;
default : return operand;
}
}

void postfix(void)
{
char symbol;
precedence token;
int n = 0;
int top = 0;
int p=0;
stack[0] = eos;

for (token=get_token(iexpr,&symbol,&n); token != eos; token=get_token(iexpr, &symbol,&n) ) {
if (token == operand)
pexpr[p++]=symbol;
else if (token == rparen) {
// 왼쪽 괄호가 나올때까지 스택안의 토큰들을 출력시킨다.
while (stack[top] != lparen)
print_token(delete(&top), &p);
delete(&top); //왼쪽 괄호를 버란다.
}
else {
while (isp[stack[top]] >= icp[token]) print_token(delete(&top), &p);
add(&top, token);
}
}

while ((token=delete(&top)) != eos) print_token(token, &p);
pexpr[p]='\0';
}

int cal(void)
{
/* 전역변수로 되어 있는 후위표기식 pexpr을 연산한다.
'\0'은 수식의 끝을 나타낸다.
stack과 top은 전역변수이다.
함수 get_token은 토큰의 타입과 문자 심벌을 반환한다.
피연산자는 한 문자로 된 숫자임을 가정한다. */

precedence token;
char symbol;
int op1, op2;
int n=0; //수식문자열을 위한 카운터
int top = -1;

token = get_token(pexpr, &symbol, &n);

while (token != eos) {

if (token == operand)
add(&top, symbol-'0'); // 스택에 삽입

else {
// 피연산자를 삭제하여 연산을 수행한 후, 그 결과를 스택에 삽입한다.
op2 = delete(&top);
op1 = delete(&top);

switch (token) {

case plus : add(&top, op1+op2);
break;
case minus : add(&top, op1-op2);
break;
case times : add(&top, op1*op2);
break;
case divide : add(&top, op1/op2);
break;

case mod : add(&top, op1%op2);

} // switch
} // else

token = get_token(pexpr, &symbol, &n);
}
return delete(&top); //결과 반환
}

lminl23의 이미지

가능한 상세하게 부탁드려요..
아 이 소스는 중위 표기에서 후위 표기로 만든 소스입니다.

익명 사용자의 이미지

역폴란드 표기법 때문에 스택 쓰시는 것 같은데.. 스택을 이용해서 중위식을 후위식으로 표현하는 알고리즘은 구글링만 해도 인터넷에 나와있습니다.
직접 공부하시길 바랍니다.

kid1402의 이미지

여기는 과제를 해주는 곳이 아닙니다.. 공부하다 막히는 곳이 있을 때 물어보는 곳이죠

뭘 가능한 상세하게 부탁하는지 모르겠지만 적어도 스스로 공부하실꺼면, 소스 분석하다 모르는 부분을 물어보셔야지 이렇게 통째로 묻는건 좀 아니라고 보네요

shinrolen의 이미지

공감합니다.

공부할 맘이 없으시면 숙제 대행사이트 알아보시는것도

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.