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

实在找不到异常了,大家帮忙运行调试下,多谢

2012-03-07 
实在找不到错误了,大家帮忙运行调试下,谢谢。写的这个程序是将中缀式化为后缀式,帮忙看看,谢谢#includeios

实在找不到错误了,大家帮忙运行调试下,谢谢。
写的这个程序是将中缀式化为后缀式,帮忙看看,谢谢
#include   <iostream>
#include   <string>
#include   <vector>
using   namespace   std;

bool   in_or_out(string   &s)
{
string   bitch   =   "!+-*/> <> <&|#() ";
if(bitch.find(s)   <   bitch.size())
return   true;
else   return   false;
}

int   pri(string   &s)
{
if(s== "# ")
return   1;
else   if(s== "( ")
return   2;
else   if(s== ") ")
return   2;
else   if(s== "&& ")
return   3;
else   if(s== "|| ")
return   3;
else   if(s== "> ")
return   4;
else   if(s== " < ")
return   4;
else   if(s== "> = ")
return   5;
else   if(s== " <= ")
return   5;
else   if(s== "!= ")
return   6;
else   if(s== "== ")
return   6;
else   if(s== "+ ")
return   7;
else   if(s== "- ")
return   7;
else   if(s== "* ")
return   8;
else   if(s== "/ ")
return   8;
else   if(s== "! ")
return   9;
else   return   0;
}

bool   operator> (string   &s1,string   &s2)
{//重载>
int   i   =   pri(s1);
int   j   =   pri(s2);
        return   (i> j);
}

bool   operator <(string   &s1,string   &s2)
{//重载 <
int   i   =   pri(s1);
int   j   =   pri(s2);
return   (i <j);
}

bool   operator==(string   &s1,string   &s2)
{//重载==
int   i   =   pri(s1);
int   j   =   pri(s2);
return   (i==j);
}

int   main()
{
string   string_input;
cout   < <   "Input   the   expression: "   < <   endl;
        cin   > >   string_input;
string_input   +=   "# ";
vector <string>   priority;
const   string   prio_first   =   "# ";
priority.push_back(prio_first);
vector <string> ::iterator   iter   =   priority.end()   -   1;//将迭代器初始化为指向priority的最后一个元素
string   string_output;
string::size_type   ix   =   0;
while(string_input[ix]   !=   '# ')
{
string   temp   =   " ";
temp   +=   string_input[ix];
if(!in_or_out(temp))
string_output   +=   temp;
else
{
++ix;
string   temp_1   =   " ";
temp_1   +=   string_input[ix];
if(in_or_out(temp_1))
temp   +=   temp_1;
else   ix--;
        while(temp   <   (*iter))
        {
const   string   kobe   =   ") ";
        if(temp   !=   kobe)
        {
string_output   +=   (*iter);
        iter   =   priority.erase(iter)   -   1;


        }
        else
        {
const   string   bryant   =   "( ";
        for(vector <string> ::iterator   iter_x   =   iter;(*iter_x)   !=   bryant;   --iter_x)
{
string_output   +=   (*iter_x);
        iter   =   priority.erase(iter)   -   1;
        }
        iter   =   priority.erase(iter)   -   1;
        }
}
        priority.push_back(temp);
        ++iter;
}
++ix;
}
return   0;
}

[解决办法]
//把中缀表达式化为后缀表达式
//基本解题思路
//使用栈的算法也很多,说个好想的。
//假设表达式的字符来自输入流in,建立栈A存放运算符,B存放结果,从in读入一个操作数压进B,读入一个运算符压进A,如此反复。
//1.读入一个元素e
//2.如果e是操作数或者(,压入B,跳转到1
//3.如果e是运算符(不包含括号),跳转到3.1
//4.如果e是),跳转到4.1
//5.如果e是EOF,即输入流结束,反复弹出A栈顶压入B,直到A为空,算法结束,B从栈底到栈顶的符号即为后缀表达式(需要把B翻个个儿^_^)

//3.1.判断A的栈定符号t,如果t不为(,且优先级大于等于e,则弹出t压入B,跳转到4,如果t为空,即栈中为空,或其他情况直接把e压入A,跳转到1
//4.1.弹出A的栈顶压入到B,如此反复直到弹出的符号为(,(和)不要压入B,跳转到1
#i nclude <stdio.h>
#i nclude <stdlib.h>
#define MAX 100
typedef struct //存放结果
{
char data[MAX];
int top;
}Stack1;
typedef struct //存放符号
{
char data[MAX];
int top;
}Stack2;


//对栈进行初始化
void Init_Stack(Stack1 *SS1,Stack2 *SS2)
{
SS1-> top=SS2-> top=-1;
//SS1-> data[SS1-> top]=SS2-> data[SS2-> top]=0;
}


//判断+ - * /
int Jadge(char ch,Stack1 *SS1,Stack2 *SS2)
{
int i;
switch(ch)
{
case '+ ': //对 '+ '号的处理
if(SS1-> data[SS1-> top]== '- '||SS1-> data[SS1-> top]== '* '||SS1-> data[SS1-> top]== '/ ')
{
SS2-> data[++SS2-> top]=SS1-> data[SS1-> top--];
SS1-> data[++SS1-> top]=ch;
}
else
SS1-> data[++SS1-> top]=ch;
return 1;
/////////////////////////////
case '- ': //对 '- '号的处理
if(SS1-> data[SS1-> top]== '+ '||SS1-> data[SS1-> top]== '* '||SS1-> data[SS1-> top]== '/ ')
{
SS2-> data[++SS2-> top]=SS1-> data[SS1-> top--];
SS1-> data[++SS1-> top]=ch;
}

else
SS1-> data[++SS1-> top]=ch;
return 1;
/////////////////////////////

case '* ': //对 '* '的处理
if(SS1-> data[SS1-> top]== '/ ')
{
SS2-> data[++SS2-> top]=SS1-> data[SS1-> top--];
SS1-> data[++SS1-> top]=ch;
}
else
SS1-> data[++SS1-> top]=ch;
return 1;

////////////////////////////

case '/ ': //对 '/ '的处理
if(SS1-> data[SS1-> top]== '* ')
{
SS2-> data[++SS2-> top]=SS1-> data[SS1-> top--];
SS1-> data[++SS1-> top]=ch;
}
else
SS1-> data[++SS1-> top]=ch;
return 1;

/////////////////////////////
case ') ': //对 ') '的处理
i=SS1-> top;

//判断栈SS1中是否有与 ') '匹配的 '( '
while(SS1-> data[i]!= '( ' && i> =0)i--;


if(i==-1)return 0;

//遇到当 ') '遇到 '( '的操作
while(SS1-> data[SS1-> top]!= '( ')
{
SS2-> data[++SS2-> top]=SS1-> data[SS1-> top--];
}
SS1-> top--;

return 1;
//break;
//3+4/(5-(6*5))*8
}
}

void main()
{


Stack1 *SS1=(Stack1 *)malloc(sizeof(Stack1));
Stack2 *SS2=(Stack2 *)malloc(sizeof(Stack2));
Init_Stack(SS1,SS2);
//printf( "%d %d ",SS1-> data[SS1-> top],SS2-> data[SS2-> top]);
int i,flag,k=0,sum1,sum2;
char ch[MAX];
printf( "请输入中缀表达式: ");
gets(ch);
while(ch[k])
{
// printf( "%c ",*(ch+i));
//i++;
if(ch[k]> = '0 '&&ch[k] <= '9 ')
SS2-> data[++SS2-> top]=ch[k];
else if(ch[k]== '( ')
SS1-> data[++SS1-> top]=ch[k];
else if(ch[k]== '+ ' ||ch[k]== '- '||ch[k]== '* ' || ch[k]== '/ '||ch[k]== ') ')
flag=Jadge(ch[k],SS1,SS2);
if(!flag) break;
k++;
}
if(flag)
{
//判断 '( '与 ') '的个数是否相同
for(i=0;i <=SS1-> top;i++)
{
if(ch[i]== '( ') sum1++;
if(ch[i]== ') ') sum2++;
}
if(sum1!=sum2)
{
printf( "表达式错误.\n ");
return;
}
//输出后缀表达式
printf( "后缀表达式为: ");
for(i=0;i <=SS2-> top;i++)
printf( "%c ",SS2-> data[i]);
for(i=SS1-> top;i> =0;i--)
printf( "%c ",SS1-> data[i]);
printf( "\n ");
}

else
printf( "表达式错误.\n ");


}

热点排行