首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

栈的例子提问,该怎么处理

2012-02-05 
栈的例子提问求一表达式的值:先将算术表达式转换成后缀表达式,然后对后缀表达式求值以字符形式输入,存放在

栈的例子提问


求一表达式的值:   先将算术表达式转换成后缀表达式,然后对后缀表达式求值
          以字符形式输入,存放在字符型数组str中,后缀表达式存放在字符型数组exp中,将算术表达式转换成后缀表达式过程中用字符型数组stack作为栈.操作如下:
1.若ch   为数字,后后续所有数字依次存入数组exp,并以字符   #     标志数字结束
2.若ch为左括号   (       将特号插入栈   stack
3.若ch   为右括号   )     将栈stack中左括号   以前的字符依次删除并存入数组exp中,后将左括号   (     删除
4.若ch   为+,-   ,将当前栈stack   中左括号以前的所有字符(运算符)依次删除并存入数组exp中,然后将ch
        插入栈stack中
5.若ch   为   *,     /     将当前栈stack中的栈顶端连续的   *   ,   /       删除并依次存入数组exp中,然后ch插入栈stack      
      中,
6.若ch为   #     将栈stack的所有运算符依次删除并存入数组exp中,再将ch   存入数组exp中,最后在exp
        得出表达式后缀表示.
#include <stdio.h>
#define   MAX   100
char   exp[MAX];
void   trans()                         //   将算术表达式转换成后缀表达式
{
        char   str[MAX];             //   存储原算术表达式
        char   stack[MAX];         //   作栈使用
        char   ch;                                                                                                   [color=#FF0000]问题一:为什么下标以一为开始呢?[/color]         int   sum,i,j,t,top=0;     //   t   为   exp的下标,top   作stack的下标,i作str的下标
        printf( "**********************8**************************************\n ");
        printf( "*输入一个求值的表达式,以#结束。只能包含+-*/运算符和正整数*\n ");
        printf( "**************************************************************\n ");
        printf( "算术表达式: ");
        i=0;
        do                                                     //   获取用户输入的表达式
        {
                i++;
                scanf( "%c ",&str[i]);
        }while(str[i]!= '# '   &&   i!=MAX);
        sum=i;                             //   记录输入表达式总的字符数
        t=1;i=1;
        ch=str[i];i++;
        while(ch!= '# ')
        {
                switch(ch)
                {
                case   '( ':                           //   判定为左括号
                        top++;stack[top]=ch;break;
                case   ') ':                             //   判定为右括号


                        while(stack[top]!= '( ')
                        {
                                exp[t]=stack[top];top--;t++;
                        }
                        top--;
                        break;                     [color=#FF0000]问题二:这里开始,下面的top都是top++,为什么呢?[/color]
                case   '+ ':                                   //   判定为加减号
                case   '- ':
                        while(top!=0   &&   stack[top]!= '( ')
                        {
                                exp[t]=stack[top];top--;t++;
                        }
                        top++;stack[top]=ch;
                        break;
                case   '* ':                                 //   判定为乘除号
                case   '/ ':
                        while(stack[top]== '* '   ||   stack[top]== '/ ')
                        {
                                exp[t]=stack[top];top--;t++;
                        }
                        top++;stack[top]=ch;
                        break;
                case   '   ':break;
                default:while(ch> = '0 '   &&   ch <= '9 ')         //   判定为数字
                                {
                                        exp[t]=ch;t++;
                                        ch=str[i];i++;
                                }
                        i--;


                        exp[t]= '# ';t++;
                }
                ch=str[i];i++;
        }
        while(top!=0)
        {
                exp[t]=stack[top];t++;top--;
        }
        exp[t]= '# ';
        printf( "\n\t原来表达式: ");
        for(j=1;j <sum;j++)   printf( "%c ",str[j]);
        printf( "\n\t后缀表达式: ",exp);
        for(j=1;j <t;j++)   printf( "%c ",exp[j]);
}
void   compvalue()                 //   计算后缀表达式的值
{
        float   stack[MAX],d;       //   作为栈使用
        char   ch;
        int   t=1,top=0;               //   t作为exp的下标,top作为stack的下标
        while(ch!= '# ')                     [color=#FF0000]问题三:这里是以数组exp所以经过数字就会有#为什么可以历遍整个表达式呢?[/color]         {
                switch(ch)
                {
                case   '+ ':stack[top-1]=stack[top-1]+stack[top];
                        top--;break;
                case   '- ':stack[top-1]=stack[top-1]-stack[top];
                        top--;break;
                case   '* ':stack[top-1]=stack[top-1]*stack[top];
                        top--;break;
                case   '/ ':
                        if(stack[top]!=0)
                                stack[top-1]=stack[top-1]/stack[top];
                        else
                        {
                                printf( "\n\t除零错误!\n ");
                                exit(0);
                        }
                        top--;break;
                default:d=0;
                        while(ch> = '0 '   &&   ch <= '9 ')         //   判定为数字字符
                        {


[color=#FF0000]     问题四:这里的d置0这样的表达式好像没啥意义吧?[/color]                
                                                                                                                                        d=10*d+ch- '0 ';                       //   将数字字符转换成对应数值
                                ch=exp[t];t++;
                        }
                        top++;
                        stack[top]=d;
                }
                ch=exp[t];t++;
        }
        printf( "\n\t计算结果:%g\n ",stack[top]);
}
void   main()
{
        trans();
        compvalue();
}

输入表达式(56-20)/(4+2)#
原表达式:(56-20)/(4+2)
后缀表达式:56#20#-4#2#+/
结果:6
总的来说对这例子整个运行过程都不太理解,请指点一下吧[s:6][s:6]

[解决办法]
你给的程序看不懂,
栈表达式求值,关键是设置各种运算符的优先级,栈内栈外的运算符优先级不一样
[解决办法]
你的t++加多了,我认为
[解决办法]

热点排行