求助各位大神,下面这个程序哪里出错了

qq_33015103 2015-11-21 06:08:50
程序是想判断表达式是否一样,我就想取一些特定的数字来代替字母来检验两个表达式得出的数是否一样
输入
第一行:N(1<=N<=20),表示测试数据组数。
接下来每组测试数据包括两行,每行包括一个数学表达式,每个表达式的长度不超过80个字符。输入数据没有空行。

一个表达式可能包括:
单个英文字母表示的变量(区分大小写)
数字(只有一位数)
配对的括号
运算符加+、减-、乘*
任意数量的空格或tab(可能出现在表达式中间的任何位置)

#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#include<ctype.h>
int p[26]={3,5,7,11,13,17,19,23,29,31,37,41,43,47,53,59,61,35,55,65,75,67,71,73,87,91};

struct Seqstack{
int MAXNUM;
int t;
char *a;
};
typedef struct Seqstack *PSeqstack;

struct Seqstackk{
int MAXNUM;
int t;
int *b;
};
typedef struct Seqstackk *PSeqstackk;

PSeqstack creatEmptystack_seq(int m)/*创建一个空的栈*/
{
PSeqstack s=(PSeqstack)malloc(sizeof(struct Seqstack));
if(s==NULL){
printf("There is no enough space.\n");
return NULL;
}
else{
s->MAXNUM=m;
s->t=-1;
s->a=(char*)malloc(m*sizeof(char));
if(s->a==NULL){
printf("No space.\n");
free(s);
return NULL;
}
else return s;
}
}

PSeqstackk creatEmptystackk_seq(int m)/*创建一个空的栈*/
{
PSeqstackk s=(PSeqstackk)malloc(sizeof(struct Seqstackk));
if(s==NULL){
printf("There is no enough space.\n");
return NULL;
}
else{
s->MAXNUM=m;
s->t=-1;
s->b=(int*)malloc(m*sizeof(int));
if(s->b==NULL){
printf("No space.\n");
free(s);
return NULL;
}
else return s;
}
}

int isempty(PSeqstack ps)/*是空栈就返回1,否则返回0*/
{
return (ps->t==-1);
}

int isemptyk(PSeqstackk ps)/*是空栈就返回1,否则返回0*/
{
return (ps->t==-1);
}

void push_seq(PSeqstack ps,char x)/*插入一个新元素到栈里*/
{
if(ps->t==ps->MAXNUM-1){
printf("The stack is full.\n");
return;
}
else{
ps->t=ps->t+1;
ps->a[ps->t]=x;
return ;
}
}

void push_seqk(PSeqstackk ps,int x)/*插入一个新元素到栈里*/
{
if(ps->t==ps->MAXNUM-1){
printf("The stack is full.\n");
return;
}
else{
ps->t=ps->t+1;
ps->b[ps->t]=x;
return ;
}
}

void pop_seq(PSeqstack ps)/*把栈顶元素扔出去*/
{
if(ps->t==-1) printf("Underflow!\n");
else ps->t=ps->t-1;
}

void pop_seqk(PSeqstackk ps)/*把栈顶元素扔出去*/
{
if(ps->t==-1) printf("Underflow!\n");
else ps->t=ps->t-1;
}

char top_seq(PSeqstack ps)/*取栈顶元素*/
{
if(ps->t==-1){
printf("The stack is empty.\n");
return '\0';
}
else return (ps->a[ps->t]);
}

char top_seqk(PSeqstackk ps)/*取栈顶元素*/
{
if(ps->t==-1){
printf("The stack is empty.\n");
return '\0';
}
else return (ps->b[ps->t]);
}

char* changeform(char *s)/*把中缀表达式转化为后缀表达式*/
{
char *back;
PSeqstack ps=creatEmptystack_seq(80);
int i,j;
i=0; j=0;
if(ps==NULL){
printf("Wrong.\n");
return NULL;
}
back=(char *)malloc(sizeof(char)*80);
if(back==NULL){
printf("Wrong.\n");
free(ps);
return NULL;
}
while(*(s+i)!='\0'){
if(isalpha(*(s+i))||isdigit(*(s+i))){
*(back+j)=*(s+i);
++j;
++i;
continue;
}/*如果遇到是字母或者数字就直接放进后缀数组*/
if(isempty(ps)){
push_seq(ps,*(s+i));
++i;
continue;
}/*如果栈是空的就把运算符放进栈里*/
if(*(s+i)=='('){
push_seq(ps,*(s+i));
++i;
continue;
}/*如果是左半边括号就直接放进栈了*/
if(*(s+i)==')'){
while(top_seq(ps)!='('){
*(back+j)=top_seq(ps);
++j;
pop_seq(ps);
}
pop_seq(ps);
++i;
continue;
}/*当遇到右半边括号就把栈里直到左半边括号的运算符都放入后缀数组*/
if(*(s+i)=='+'||'-'){
while(!isempty(ps)){
*(back+j)=top_seq(ps);
++j;
pop_seq(ps);
}
push_seq(ps,*(s+i));
++i;
continue;
}/*如果是加号或者减号*/
if(*(s+i)=='*'){
push_seq(ps,'*');
++i;
continue;
}
}
while(!isempty(ps)){
*(back+j)=top_seq(ps);
pop_seq(ps);
++j;
}
free(ps);
*(back+j)='\0';
return back;
}

int changeintodigit(char *back)
{
int result;
PSeqstackk ps=creatEmptystackk_seq(80);
int i=0,g,h;
if(ps==NULL){
printf("Wrong.\n");
return -1;
}
while(*(back+i)!='\0'){
if(isalpha(*(back+i))){
push_seqk(ps,p[*(back+i)-'a']);
++i;
continue;
}/*遇到字母*/
if(isdigit(*(back+i))){
push_seqk(ps,*(back+i)-'0');
++i;
continue;
}/*遇到数字*/
if(*(back+i)=='*'){
g=ps->b[ps->t];
h=ps->b[ps->t-1];
pop_seqk(ps);
pop_seqk(ps);
push_seqk(ps,h*g);
++i;
continue;
}/*乘号*/
if(*(back+i)=='+'){
g=ps->b[ps->t];
h=ps->b[ps->t-1];
pop_seqk(ps);
pop_seqk(ps);
push_seqk(ps,h+g);
++i;
continue;
}/*加号*/
if(*(back+i)=='-'){
g=ps->b[ps->t];
h=ps->b[ps->t-1];
pop_seqk(ps);
pop_seqk(ps);
push_seqk(ps,h-g);
++i;
continue;
}/*减号*/
}
result=top_seqk(ps);
free(ps);
return result;
}

int main()
{
int zushu,k,n;
char *group1,*group2;
char c;
scanf("%d",&zushu);
c=getchar();
group1=(char *)malloc(sizeof(char)*80);
group1=(char *)malloc(sizeof(char)*80);
for(k=1;k<=zushu;++k){
n=0;
while((c=getchar())!='\n'){
if(!isspace(c)){
*(group1+n)=c;
++n;
}
}
*(group1+n)='\0';
n=0;
while((c=getchar())!='\n'){
if(!isspace(c)){
*(group2+n)=c;
++n;
}
}
*(group2+n)='\0';
if(changeintodigit(changeform(group1))==changeintodigit(changeform(group2))) printf("YES\n");
else printf("NO\n");
}
free(group1);
free(group2);
return 0;
}
...全文
105 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
qq_33015103 2015-11-22
  • 打赏
  • 举报
回复
原来是我沙雕了新手求问怎么给分。。
paschen 2015-11-22
  • 打赏
  • 举报
回复
引用 2 楼 qq_33015103 的回复:
原来是我沙雕了新手求问怎么给分。。
点结贴就可以给分了
logiciel 2015-11-21
  • 打赏
  • 举报
回复
  group1=(char *)malloc(sizeof(char)*80);
  group2=(char *)malloc(sizeof(char)*80);//改 group1=(char *)malloc(sizeof(char)*80);

33,311

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 新手乐园
社区管理员
  • 新手乐园社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧