基于栈数据结构实现中缀到后缀的转换

九月 18th, 2009 发表评论 阅读评论

《Data Structures and Algorithm Analysis in C》中文版中,第三章P54介绍了栈的实际应用,其中就有中缀到后缀的转换算法的详细描述和图示,该应用为编译器使用的一个算法,我使用Cmockery和前文中实现的栈数据结构来具体实现该算法,如下:

#include <stddef.h>
#include <stdarg.h>
#include <setjmp.h>
#include <cmockery.h>
#include "./stack_array.h"

int  calc_prio(char op)
{
    int rs;

    switch(op)
    {
    case '(':
        rs = 3;
        break;
    case '*':
        rs = 2;
        break;
    case '+':
        rs = 1;
        break;
    default:
        rs = 0;
        break;
    }

    return rs;
}

// convert an infix expression to a postfix expression
char* infix_to_postfix(char* buf)
{
    Stack stack = create();
   
    char* dest = (char*)malloc(MAX_LENGTH);
    char* ch = buf;
    char* ch_dest = dest;
    *dest = '\0';

    while(*ch)
    {
        switch(*ch)
        {
        case '(':
        case '+':
        case '*':
            {
                int cur_prio = calc_prio(*ch);
                int stack_prio;
                char top_ch;
               
                while (!is_empty(stack))
                {
                    top_ch = top(stack);
                    if (top_ch == '(')
                        break;                   
                    stack_prio = calc_prio(top_ch);
                    // 如果栈里的元素的优先级更高, 则将其pop出来
                    if (cur_prio<=stack_prio)
                        *ch_dest++ = pop(stack);
                    else
                        break;
                }
                push(stack, *ch);
            }        // end break
            break;
        case ')':
            {
                // 一直弹到'('为止
                char top_ch;
                if (is_empty(stack))
                {
                    printf("error format!\n");
                    break;
                }

                while (!is_empty(stack))
                {
                    top_ch = pop(stack);
                    if (top_ch != '(')
                        *ch_dest++ = top_ch;
                    else
                        break;
                }
            }
            break;
        default:    // 直接输出
            *ch_dest++ = *ch;
            break;
        }
        ch++;
    } // end while

    while(!is_empty(stack))
        *ch_dest++ = pop(stack);
    *ch_dest++ = '\0';

    printf("%s\n", dest);
    destroy(stack);
    return dest;
}

void infix_to_postfix_test(void **state)
{
    char src[] = "a+b*c+(d*e+f)*g";
    char dest[] = "abc*+de*f+g*+";
    char* tdest = infix_to_postfix(src);
    int i;

    for (i=0; i<strlen(dest); i++)
        assert_int_equal(dest[i], tdest[i]);
}

int main(int argc, char* argv[])
{
    const UnitTest tests[]={
        unit_test(infix_to_postfix_test),
    };

    return run_tests(tests);
};


  1. 2009-11-13 at 00:02 回复 引用
    朋友,这代码看样子是老外写的,想找些朋友一起深究数据结构,希望能成为朋友
  2. 2009-11-13 at 00:02 回复 引用
    我的联系方式
    QQ: 419602638
    手机: 13535042611
  3. 楚天骜
    2009-11-13 at 22:56 回复 引用
    原书是老外写的,我看的是中文翻译版,书上有算法的文字描述,实现代码是我自己写的。我也希望有时间好好重新系统的学习数据结构,现在才刚开始。
  4. 2009-11-25 at 00:29 回复 引用
    很好,留下联系方式吧,有机会一起深入研究研究
  5. 2009-11-25 at 02:20 回复 引用
    我在你的代码基础上 添加了对减和除号的操作 并且将根据后缀式将值求出来了
    我假设的是 每个数字只有各位 即0-9之间
    程序完全正确
  6. 楚天骜
    2009-11-25 at 15:19 回复 引用
    lwlm,我的QQ:69954206
    你是有心人!我实现这个算法的目的主要是希望熟悉算法过程,同时顺便熟悉cmockery和tdd,结果发现用cmockey帮了我很多忙,算法虽然都是书上的,可实现的时候仍然可能出现错误,加了测试代码后很快就可以定位错误了。 另外,我很快会接着算法学习的。也感谢你的关注!
  7. 2010-04-22 at 22:27 回复 tcacimtmcwxj, [url=http://czglmjugcjkp.com/]czglmjugcjkp[/url], [link=http://grcybtjezfyl.com/]grcybtjezfyl[/link], http://yazvbjsgqtmk.com/');" href="#commentarea">引用
    B6uNkK tcacimtmcwxj, [url=http://czglmjugcjkp.com/]czglmjugcjkp[/url], [link=http://grcybtjezfyl.com/]grcybtjezfyl[/link], http://yazvbjsgqtmk.com/
  8. 2010-04-24 at 03:28 回复 aplvdxzcdlph, [url=http://gqcjgtmkugnn.com/]gqcjgtmkugnn[/url], [link=http://ivkjklssntjk.com/]ivkjklssntjk[/link], http://kafkfkzpunun.com/');" href="#commentarea">引用
    cA8uR9 aplvdxzcdlph, [url=http://gqcjgtmkugnn.com/]gqcjgtmkugnn[/url], [link=http://ivkjklssntjk.com/]ivkjklssntjk[/link], http://kafkfkzpunun.com/
  9. 2010-04-24 at 04:56 回复 xlpoiilmgcac, [url=http://tzqitttxvtrv.com/]tzqitttxvtrv[/url], [link=http://amnwstmsfyte.com/]amnwstmsfyte[/link], http://isnmanjqcltg.com/');" href="#commentarea">引用
    sVrLIV xlpoiilmgcac, [url=http://tzqitttxvtrv.com/]tzqitttxvtrv[/url], [link=http://amnwstmsfyte.com/]amnwstmsfyte[/link], http://isnmanjqcltg.com/
  10. 2010-04-24 at 06:12 回复 pmlzeaicozxt, [url=http://arlclvsgerqc.com/]arlclvsgerqc[/url], [link=http://zzieoymjnnvy.com/]zzieoymjnnvy[/link], http://xmrfoqxajzec.com/');" href="#commentarea">引用
    cScXWR pmlzeaicozxt, [url=http://arlclvsgerqc.com/]arlclvsgerqc[/url], [link=http://zzieoymjnnvy.com/]zzieoymjnnvy[/link], http://xmrfoqxajzec.com/