读书人

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

发布时间: 2012-02-05 12:07:15 作者: rapoo

栈的例子提问


求一表达式的值: 先将算术表达式转换成后缀表达式,然后对后缀表达式求值
以字符形式输入,存放在字符型数组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++加多了,我认为
[解决办法]

读书人网 >C++

热点推荐