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

qq_33015103 qq_33015103 墨衍会员 · AI 创作全网分发 墨衍智能分发 通过墨衍一键同步至各平台 可同步平台 CSDN微信公众号微博知乎掘金百家号博客园抖音小红书 你的文章也可以这样分发 墨衍会员 ¥399起/年,写一次发全网 我也要 + 加入社区
程序是想判断表达式是否一样,我就想取一些特定的数字来代替字母来检验两个表达式得出的数是否一样
输入
第一行: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;
}
...全文

相关推荐

求助各位大虾关于itae积分指标实现的问题-heatexdemo.m

求助各位大虾关于itae积分指标实现的问题-heatexdemo.m这个在matlab里面怎么实现阿 ! 比如用pid去控制一个最简单的一阶惯性环节!用这个itae指标去优化pid的参数这个怎么弄 具

weixin_39841365

编程实现输入一个整数,显示它的位数,并显示它的各位数字,及其各位数字的和

本示例将探讨如何使用Delphi编程语言来实现一个程序,该程序能够接收用户输入的一个整数,然后显示出这个整数的位数、各位数字以及这些数字的和。下面我们将详细讲解实现这一功能所需的步骤和技术。

boycycsolo

求助用MATLAB统计字符元素个数-Exp6data.txt

求助用MATLAB统计字符元素个数-Exp6data.txt如何用MATLAB分别统计出附件里1—20行,每行中agtc的个数,和占相应行总元素的比例。向各位大神跪求代码与详解

weixin_39840387

代码_C循环-求各位数字之积_

下面我们将深入探讨这个知识点。首先,我们需要知道在C语言中,如何获取一个整数的每一位。这通常通过模运算(%)和右移运算(>>)来实现。

肝博士杨明博大夫

输出整数各位数字.pdf

在给定的"输出整数各位数字.pdf"文件中,描述了一个简单的C语言程序,用于演示如何做到这一点。下面我们将详细讨论这一过程及其背后的原理。首先,我们要了解取模运算符 `%`。

一只会写程序的猫
评论 3
收藏 已收藏
分享
返回顶部
qq_33015103
新手乐园 33,315 成员 41,769 内容