当前位置:编程学习 > C/C++ >>

C++问题:数据结构

#include<iostream>
using namespace std;
int compare(char *p,char pchar)
{
int i=0;
if((p[i]=='+'||p[i]=='-')&&(pchar=='*'||pchar=='/'||pchar=='('))
return '<';
else if(p[i]=='#'&&(pchar=='+'||pchar=='-'||pchar=='*'||pchar=='/'))return '<';
else if((p[i]=='*'||p[i]=='/')&&pchar=='(')
return '<';
else if(p[i]=='('&&pchar==')'||p[i]=='#'&&pchar=='#')
return '==';
//else if((p[i]=='+'||p[i]=='-')&&(pchar==')'||pchar=='#'||pchar=='+'||pchar=='-'))return '>';加减乘除都在左括号的右边(后边)
else if((p[i]=='*'||p[i]=='/')&&(pchar=='#'||pchar=='+'||pchar=='-')||pchar=='*'||pchar=='/')return '>';
else if(p[i]=='('&&(pchar=='#'||pchar=='+'||pchar=='-')||pchar=='*'||pchar=='/'||pchar=='(')return '>';

}
void suffix(char *p,char *q)//将表达式变成后缀表达式,,//p储存表达式,q用于储存后缀表达式
{
int top=0,_top=0;//设置栈顶指示器

char *pchar=new char[];//用于储存运算符
pchar[top++]='#';

for(int i=0;i<strlen(p);i++)
{
switch(p[i])
{
case'0':
case'1':
case'2':
case'3':
case'4':
case'5':
case'6':
case'7':
case'8':
case'9':
{
q[_top++]=p[i];
break;
}
case'+':
case'-':
case'*':
case'/':
case'(':
case')':

if(compare(p,pchar[top-1])=='<')//比较两个运算符的优先级
{

q[_top++]=pchar[top--];
}
else if(compare(p,pchar[top-1])=='==')top--;

else if(compare(p,pchar[top-1])=='>')
{
pchar[top++]=p[i];
}



}
q[_top]='\0';//////////////////////
}

}
int caculate_expression(char *q)//q只是一个普通的指向一个数组的指针
{
int s[100];
int top=0;
while(*q!='\0')
{
switch(*q)
{
case'0':
case'1':
case'2':
case'3':
case'4':
case'5':
case'6':
case'7':
case'8':
case'9': {s[top++]=int(*q)-48,q++;break;}

case'+': {s[top-2]=s[top-1]+s[top-2],top--,q++; break;}
case'-': {s[top-2]=s[top-1]-s[top-2],top--,q++; break;}
case'*': {s[top-2]=s[top-1]*s[top-2],top--,q++; break;}
case'/': {s[top-2]=s[top-1]/s[top-2],top--,q++; break;}
}

}
return s[0];
}
void main()
{
char *p=new char[20],*q=new char[20];//p储存表达式,q用于储存后缀表达式
int result;
cout<<"请输入算术表达式,并以#号结尾:"<<endl;
cin>>p;
suffix(p,q);

result=caculate_expression(q);
cout<<result<<endl;
}输出的结果不对,那位大哥在我看看是那个地方出问题 了,回答正确后立即采纳为答案,谢谢!

追问:编译有错啊

答案:对你的程序进行全面修改,关键地方都作了注释,调试成功

include "stdafx.h"
#include<iostream>
using namespace std;

// 判断两个操作符的优先级
int compare(char p,char pchar)
{
if((p=='+'||p=='-')&&(pchar=='*'||pchar=='/'))
return '<';
else if((p=='*'||p=='/')&&(pchar=='+'||pchar=='-'))
return '>';
return '=';
}

//将表达式变成后缀表达式,,//p储存表达式,q用于储存后缀表达式
void suffix(char *p,char *q)
{
//初始化一个空堆栈,将结果字符串变量置空。
int top=0,_top=0;//设置栈顶指示器
char *pchar=new char[];//用于储存运算符
for(int i = 0;i < strlen(p);i++)
{
//从左到右读入中缀表达式,每次一个字符。
switch(p[i]){
case'0':
case'1':
case'2':
case'3':
case'4':
case'5':
case'6':
case'7':
case'8':
case'9':
{
//如果字符是操作数,将它添加到结果字符串。
q[_top++]=p[i];
}
break;
case'+':
case'-':
case'*':
case'/':
{
//如果字符是个操作符,弹出(pop)操作符,直至遇见开括号(opening parenthesis)、优先级较低的操作符或者同一优先级的右结合符号。把这个操作符压入(push)堆栈。
while(top > 0)
{
char c = pchar[top - 1];
if(c == '(' || compare(c, p[i]) == '<')
break;
q[_top++] = c;
top--;
}
pchar[top++] = p[i];
}
break;
case'(':
{
//如果字符是个开括号,把它压入堆栈。
pchar[top++] = p[i];
}
break;
case')':
{
//如果字符是个闭括号(closing parenthesis),在遇见开括号前,弹出所有操作符,然后把它们添加到结果字符串。
while(top > 0)
{
char c = pchar[top - 1];
top--;
if(c == '(')
break;
q[_top++] = c;
}
}
break;
case'#':
{
//表达式结束
}
break;
default:;
}
}
//如果到达输入字符串的末尾,弹出所有操作符并添加到结果字符串。
while(top > 0)
{
char c = pchar[top - 1];
top--;
if(c == '(')
{
// 表达式错误
break;
}
q[_top++] = c;
}
q[_top]='\0';
}

// 计算后缀表达式的值,q只是一个普通的指向一个数组的指针
int caculate_expression(char *q)
{
//初始化一个空堆栈
int s[100];
int top=0;
while(*q != '\0')
{
//从左到右读入后缀表达式
switch(*q){
case'0':
case'1':
case'2':
case'3':
case'4':
case'5':
case'6':
case'7':
case'8':
case'9':
{
//如果字符是一个操作数,把它压入堆栈。
s[top++] = int(*q) - 48;
}
break;
case'+':
{
//如果字符是个操作符,弹出两个操作数,执行恰当操作,然后把结果压入堆栈。如果您不能够弹出两个操作数,后缀表达式的语法就不正确。
if(top > 1)
{
int b = s[--top];
int a = s[--top];
int r = a + b;
s[top++] = r;
}
else
{
// 表达式错误
}
}
break;
case'-':
{
//如果字符是个操作符,弹出两个操作数,执行恰当操作,然后把结果压入堆栈。如果您不能够弹出两个操作数,后缀表达式的语法就不正确。
if(top > 1)
{
int b = s[--top];
int a = s[--top];
int r = a - b;
s[top++] = r;
}
else
{
// 表达式错误
}
}
break;
case'*':
{
//如果字符是个操作符,弹出两个操作数,执行恰当操作,然后把结果压入堆栈。如果您不能够弹出两个操作数,后缀表达式的语法就不正确。
if(top > 1)
{
int b = s[--top];
int a = s[--top];
int r = a * b;
s[top++] = r;
}
else
{
// 表达式错误
}
}
break;
case'/':
{
//如果字符是个操作符,弹出两个操作数,执行恰当操作,然后把结果压入堆栈。如果您不能够弹出两个操作数,后缀表达式的语法就不正确。
if(top > 1)
{
int b = s[--top];
int a = s[--top];
int r = a / b;
s[top++] = r;
}
else
{
// 表达式错误
}
}
break;
default:;
}
q++;
}
//到后缀表达式末尾,从堆栈中弹出结果。若后缀表达式格式正确,那么堆栈应该为空。
if(top != 0)
{
// 表达式错误
}
return s[0];
}
void main()
{
char *p=new char[20],*q=new char[20];//p储存表达式,q用于储存后缀表达式
int result;
cout<<"请输入算术表达式,并以#号结尾:"<<endl;
cin>>p;
suffix(p,q);
cout<<q<<endl; // 输出后缀表达式
result=caculate_expression(q);
cout<<result<<endl; // 输出计算结果
cin>>p; // 等待输入一个字符后退出
}

你的suffix(p,q)函数有问题,转换后将运算符不再放在指针q里,比如4+3,本来转换后应该是43+,而你的q实际上只有43.这样永远都不可能有算术运算。

上一个:怎么样才能学好C++
下一个:c++的学习问题

CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,