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

生手数据结构,帮帮忙

2012-06-20 
新手数据结构,帮帮忙。这是我们书上的代码,问老师老师说是对的,但是我就是一直都调不出来,求解。。。#include

新手数据结构,帮帮忙。
这是我们书上的代码,问老师老师说是对的,但是我就是一直都调不出来,求解。。。

#include<iostream>
#include<conio.h>
using namespace std;
typedef double ElemType;
const int MAXSIZE=100;

typedef struct SeqStack
{
ElemType data[MAXSIZE];
int top;
}SeqStack;

SeqStack SeqStackInit()
{
SeqStack S;
S.top=-1;
return S;
}

SeqStack SeqStackPush(SeqStack S,ElemType x)
{
if(S.top==MAXSIZE-1)
{
cout<<"栈已满"<<endl;
}
else
{
S.top++;
S.data[S.top]=x;
}
return S;
}

SeqStack SeqStackPop(SeqStack S)
{
ElemType x;
if(S.top==-1)
cout<<"栈为空"<<endl;
else
{
x=S.data[S.top];
S.top--;
}
return S;
}

ElemType SeqStackGetTop(SeqStack S)
{
if(S.top!=-1)
{
return (S.data[S.top]);
}
else
{
cout<<"栈为空"<<endl;
return 0;
}
}

double CalculExp()
{
//ch为扫描表达式,theta为运算符,ab均为运算数,opnd为运算数栈,oprt为运算符栈.
char ch,theta,a,b;
SeqStack optr,opnd;
char precede(char,char);
ElemType operate(char,char,char);
optr=SeqStackInit();
optr=SeqStackPush(optr,'#');
opnd=SeqStackInit();
cin>>ch;
while(!((ch=='#')&&(SeqStackGetTop(optr)=='#')))
{
if(ch>='0'&&ch<='9')
{
opnd=SeqStackPush(opnd,ch-48);
cin>>ch;
}
else
switch(precede(SeqStackGetTop(optr),ch))
{
case'<':
optr=SeqStackPush(optr,ch);
cin>>ch;
break;
case'=':
optr=SeqStackPop(optr);
cin>>ch;
break;
case'>':
theta=SeqStackGetTop(optr);
optr=SeqStackPop(optr);
b=SeqStackGetTop(opnd);
opnd=SeqStackPop(opnd);
a=SeqStackGetTop(opnd);
opnd=SeqStackPop(opnd);
opnd=SeqStackPush(opnd,operate(a,theta,b));
break;

return(SeqStackGetTop(opnd));
}
}//这里的括弧是我自己加的书上没有
}// 同上
char precede(char a,char b)
{
char r;
switch(b)
{
case'+':
case'-':
if(a=='('||a=='#')
r='<';
else
r='>';
break;
case'*':
case'/':
if(a=='*'||a=='/'||a==')')
r='>';
else
r='<';
break;
case'(':
if(a==')')
{
cout<<"括号匹配错误"<<endl;
exit(-1);
}
else
r='<';
break;
case')':
if(a=='(')
r='=';
else
if(a=='#')
{
cout<<"error!没有左括号"<<endl;
exit(-1);
}
else
r='>';
break;
case'#':
if(a=='(')
{
cout<<"error!没有右括号"<<endl;
exit(-1);
}
else 
if(a=='#')
r='=';
else
r='>';
break;
}
return r;
}

ElemType operate(char a,char b,char c)
{
ElemType result;
switch(b)
{
case'+':
result=a+c;
break;
case'-':
result=a-c;
break;
case'*':
result=a*c;
break;
case'/':
if(0==c)
{
cout<<"除数不能为0!"<<endl;
exit(-1);
}
else
result=a/c;
break;
}
return result;
}
void main()
{
cout<<"请输入要求的表达式的(以#结束):"<<endl;
cout<<"运算结果为:"<<CalculExp()<<endl;
getch();
}

[解决办法]
return(SeqStackGetTop(opnd));这个语句要放在while外边。不然指向了一个case,就break,就会退出循环,返回不到栈顶值了。判断优先级里,我将你代码复制到VC里,发现有个括号格式是中文输入法下的,要改过来。这数据结构经典,我权当是复习了。

热点排行