当前位置:首页 » 编程语言 » c语言栈实现四则运算的思路
扩展阅读
webinf下怎么引入js 2023-08-31 21:54:13
堡垒机怎么打开web 2023-08-31 21:54:11

c语言栈实现四则运算的思路

发布时间: 2022-12-25 13:52:25

1. 请问怎么用c语言编写四则运算的程序呢

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define size 20

typedef float NUM;

typedef struct
{
NUM data[size];
int top;
}*Space,Lnode;

void begin();
void initialize(Space x,Space y);
void input(Space x,Space y);
int is_operator(char a_operator);
int pushf(Space s,float x);
int pushc(Space s,char x);
int empty(Space s);
int priority(char o);
int popf(Space s,float *x);
int popc(Space s,int *x);
float result(int a_operator,float operand1,float operand2);

main()
{
begin();
system("pause");
}

void begin()
{
Lnode operand,a_operator;//定义两个指向结构体的指针
Space s_operand=&operand,s_operator=&a_operator;
initialize(s_operand,s_operator);//初始化
input(s_operand,s_operator);//开始
}

void initialize(Space s,Space t)//初始化数据栈、运算符栈
{
s->top=0;
t->top=0;
}

void input(Space x,Space y)
{
int i,j,position=0,op=0;
float operand1=0,operand2=0,evaluate=0;//用来储存两个计算数 和 一个结果
char string[50];//所输入的表达式
char temp[50];//用来临时存放小数

printf("请输入表达式: ");
gets(string);

while(string[position]!='\0'&&string[position]!='\n')
{
i=0;
strcpy(temp,"0");

if(is_operator(string[position]))//判断是否为运算符
{
if(!empty(y))
{
while(!empty(y)&&priority(string[position])<=priority(y->data[y->top-1]))//判断优先级
{
popf(x,&operand1);
popf(x,&operand2);
popc(y,&op);
pushf(x,result(op,operand1,operand2));//计算结果
}
}
pushc(y,string[position]);//运算符入栈
position++;
}

while((string[position]!='\0'&&string[position]!='\n')&&(!is_operator(string[position])))//数据存入temp数组
{
temp[i]=string[position];

i++;
position++;
}
pushf(x,atof(temp));//将数组强制转换为浮点型 然后进行入栈操作 x为指向数据栈的指针 atof函数即使强制转换类型
}

while(!empty(y))
{
popc(y,&op);
popf(x,&operand1);
popf(x,&operand2);

pushf(x,result(op,operand1,operand2));
}
popf(x,&evaluate);

printf("结果是 : %f",evaluate);
}

int pushf(Space s,float x)//数据入栈
{
if(s->top==size)
return 0;
s->data[s->top]=x;
s->top++;
return 1;
}

int pushc(Space s,char x)//运算符入栈
{
if(s->top==size)
return 0;
s->data[s->top]=x;
s->top++;
return 1;
}

int popf(Space s,float *x)//数据出栈
{
if(s->top==0)
return 0;
else
{
s->top--;
*x=s->data[s->top];
return 1;
}
}

int popc(Space s,int *x)//运算符出栈
{
if(s->top==0)
return 0;
else
{
s->top--;
*x=s->data[s->top];
return 1;
}
}

int empty(Space s)//判断栈空
{
if(s->top==0)
return 1;
else
return 0;
}

int is_operator(char Operator) //判断是否为运算符
{
switch(Operator)
{
case '+':
case '-':
case '*':
case '/':
return 1;
default:
return 0;
}
}

int priority(char o) //判断运算符的优先级别
{
switch(o)
{
case '+':
case '-':
return 1;
case '*':
case '/':
return 2;
default:
return 0;
}
}

float result(int a_operator,float operand1,float operand2)//计算结果
{
switch(a_operator)
{
case '+':
return operand2+operand1;
case '-':
return operand2-operand1;
case '*':
return operand2*operand1;
case '/':
return operand2/operand1;
}
}

这是用栈写的 没有写输入错误的判断 你自己添加一下吧
我是因为刚好有一个现成的程序

2. 为什么用栈实现四则运算

因为栈的“先进后出”。
1,后缀表达式的转化也能使用栈对中缀表达式进行操作从而转化。明显地,由中缀表达式-后缀表达式, 后缀表达式-式子结果。 都需要使用到栈。四则运算有优先级对吧,比如乘和除都需要先算。
2,如果把符号入栈就可以入一次检查一次什么符号,下一个入栈的时候就判断谁更优先,就出栈进行运算,把这个符号入栈。
3,根据先序,后序,中序,来看入栈和出栈条件,说的简单,具体还是比较复杂吧。
4,优点就是能判断优先级,而非一般的直接从前到后计算。

3. C语言问题,利用堆栈实现四则运算,谢谢高手帮我编写出来

我就喜欢害人:)

#include<stdio.h>
#include<conio.h>
#include<stdlib.h>
#define ERR -1
#define MAX 100 /*定义堆栈的大小*/
int stack[MAX]; /*用一维数组定义堆栈*/
int top=0; /*定义堆栈指示*/

int push(int i) /*存储运算数,入栈操作*/
{
if(top<MAX)
{
stack[++top]=i; /*堆栈仍有空间,栈顶指示上移一个位置*/
return 0;
}
else
{
printf("The stack is full");
return ERR;
}
}
int pop() /*取出运算数,出栈操作*/
{
int var; /*定义待返回的栈顶元素*/
if(top!=NULL) /*堆栈中仍有元素*/
{
var=stack[top--]; /*堆栈指示下移一个位置*/
return var; /*返回栈顶元素*/
}
else
printf("The stack is empty!\n");
return ERR;
}
void main()
{
int m,n;
char l;
int a,b,c;
int k;
do{
printf("\tAriothmatic Operate simulator\n"); /*给出提示信息*/
printf("\n\tPlease input first number:"); /*输入第一个运算数*/
scanf("%d",&m);
push(m); /*第一个运算数入栈*/
printf("\n\tPlease input second number:"); /*输入第二个运算数*/
scanf("%d",&n);
push(n); /*第二个运算数入栈*/
printf("\n\tChoose operator(+/-/*//):");
l=getche(); /*输入运算符*/
switch(l) /*判断运算符,转而执行相应代码*/
{
case '+':
b=pop();
a=pop();
c=a+b;
printf("\n\n\tThe result is %d\n",c);
printf("\n");
break;
case '-':
b=pop();
a=pop();
c=a-b;
printf("\n\n\tThe result is %d\n",c);
printf("\n");
break;
case '*':
b=pop();
a=pop();
c=a*b;
printf("\n\n\tThe result is %d\n",c);
printf("\n");
break;
case '/':
b=pop();
a=pop();
c=a/b;
printf("\n\n\tThe result is %d\n",c);
printf("\n");
break;
}
printf("\tContinue?(y/n):"); /*提示用户是否结束程序*/
l=getche();
if(l=='n')
exit(0);
}while(1);
}

4. 如何运用大一C语言基础编写简单带括号的四则运算

利用堆栈将中缀表达式转换为后缀表达式计算。简单给你讲一下算法:
1.从中缀表达式中逐字符读入操作数
2.若操作数为数字,直接输出到后缀表达式队列
3.若操作数为左括号(,将其压栈
4.若操作数为加减乘除运算符,将其与栈顶元素比较:
①操作数优先级高于栈顶元素,则将操作数压栈;
②操作数优先级等于或低于栈顶元素,先将栈顶元素出栈,然后将操作数压栈。
5.若操作数为右括号),从栈顶元素开始出栈,直到遇到左括号(为止,左括号也出栈。若直到栈底仍然没有发现左括号,返回表达式匹配错误(说明右括号过多)
6.表达式读取完毕,开始将栈中所有剩余元素出栈。若出栈过程中发现有左括号,返回表达式匹配错误(说明左括号过多)
除了左括号以外,所有出栈的元素都进入到后缀表达式队列中。
7.根据后缀表达式计算算式结果。

5. 用堆栈来实现四则运算.(C语言)

here it is,1个半小时才搞定的,好辛苦,呵呵:

#include <stdio.h>
#include <ctype.h>
#include <stdlib.h>

double var[1024];
char opt[1024];
double* sp1 = var;
char* sp2 = opt;

#define PUSH(s, v) (*s++ = v)
#define POP(s) (*--s)
#define EMPTY1() (sp1 == var)
#define EMPTY2() (sp2 == opt)
#define TOP(s) (s[-1])

#define isopt1(c) (c == '+' || c == '-')
#define isopt2(c) (c == '*' || c == '/')
#define isopt(c) (isopt1(c) || isopt2(c))

#define isbkt(c) (c == '(')
double docal(double lhs, double rhs, char op)
{
switch(op) {
case '+':return lhs + rhs;
case '-':return lhs - rhs;
case '*':return lhs * rhs;
}
if(op == '/' && rhs == 0) {
printf("divided by zero encountered.\n");
exit(0);
}
return lhs / rhs;
}

void eval1(char* expr)
{
double t1, t2;
while(sp1 - var > 1 && !EMPTY2() && TOP(sp2) != '(') {
t2 = POP(sp1);
t1 = POP(sp1);
PUSH(sp1, docal(t1, t2, POP(sp2)));
}
if(expr)
PUSH(sp2, *expr);
}

void eval2(char* expr)
{
double t1, t2;
while(TOP(sp2) != '(') {
t2 = POP(sp1);
t1 = POP(sp1);
PUSH(sp1, docal(t1, t2, POP(sp2)));
}
POP(sp2);
}

double parse(char* expr)
{
double val;
while(*expr) {
if(isdigit(*expr)) {
sscanf(expr, "%lf", &val);
PUSH(sp1, val);
while(isdigit(*expr) || *expr == '.')
++expr;
--expr;
} else if(isopt(*expr)) {
if(EMPTY2() || (isopt1(TOP(sp2)) && !isopt1(*expr)) || isbkt(TOP(sp2)))
PUSH(sp2, *expr);
else if(isopt(TOP(sp2)))
eval1(expr);
} else if(*expr == '(') {
PUSH(sp2, *expr);
}

6. C语言怎么实现四则运算

我曾用c编了个计算器,支持四则运算,支持括号改变优先级,你看看吧:

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <conio.h>
#define Esc 27
#define Tab 9

void needle(char* s,char* carriage,int start)//needle意为“用针缝”
{
int size_carriage=(int)strlen(carriage);
int i,j;
for(j=0;j<size_carriage;j++)
{
for(i=(int)strlen(s);i>=start;i--)
s[i+1]=s[i];
s[i+1]=carriage[j];
start=i+2;
}
}

double factorial(double d)//factorial意为“阶乘”
{
return d==0?1:d*factorial(d-1);
}

void handle(char* carriage)//handle意为“处理”
{
void find_start(char*,int*);
char* save1,*save2,ch;
char op[111];
double d1,d2;
int start,i;
find_start(carriage,&start);
ch=carriage[start];
d1=strtod(carriage,&save1);//strtod是库函数,功能是将字符串carriage中出现的第一个浮点数转化为double,并将剩余字符储存在save1中
if(ch=='!')
{
sprintf(op,"%g",factorial(d1));//springf是库函数,功能是将显示在屏幕上的内容储存在op中
strcpy(carriage,op);
return;
}
for(i=0;i<(int)strlen(save1);i++)//对于第一个不是'+'或'-'或数字的字符串,strtod无法作用。所以得去掉诸如"*22"字符串中的'*'
save1[i]=save1[i+1];
d2=strtod(save1,&save2);
switch(ch)
{
case '*':sprintf(op,"%.32g",d1*d2);break;
case '/':sprintf(op,"%.32g",d1/d2);break;
case '+':sprintf(op,"%.16g",d1+d2);break;
case '-':sprintf(op,"%.16g",d1-d2);
}
strcpy(carriage,op);
}

void del(char* s,int start,int end)//delete意为“删除”
{
int i,j;
int size=(int)strlen(s);
for(i=end;i>=start;i--)
for(j=i;j<size;j++)
s[j]=s[j+1];
}

void (char* s,char* carriage,int start,int end)//意为“复制”
{
int i;
for(i=0;start<=end;i++,start++)
carriage[i]=s[start];
carriage[i]='\0';
}

void scissor(char* s,char* carriage,int* start)//scissor意为“用剪刀剪”
{
int sta,end;
for(sta=*start-1;(s[sta]>='0'&&s[sta]<='9')||s[sta]=='.';sta--);
if(sta!=0||s[*start]=='!') //处理式子是-2+3或-2!的特殊情况
sta++;
if(s[*start]=='!')//'!'是单目运算符
end=*start;
else
{
for(end=*start+1;(s[end]>='0'&&s[end]<='9')||s[end]=='.';end++);
if((s[end-1]=='*'||s[end-1]=='/')&&(s[end]=='+'||s[end]=='-'))//处理式子是2*-2等的特殊情况
for(end++;(s[end]>='0'&&s[end]<='9')||s[end]=='.';end++);
end--;
}
(s,carriage,sta,end);
del(s,sta,end);
*start=sta;//记住等下针线函数needle要开始缝的地方
}

void find_start(char* s,int* start)//find_start意为“找到操作符号开始处”
{
int i;
int size=(int)strlen(s);
//由优先级决定从上而下的顺序
for(i=0;i<size;i++)
if(s[i]=='!')
{
*start=i;
return;
}
for(i=0;i<size;i++)
if(s[i]=='*'||s[i]=='/')
{
*start=i;
return;
}
if(s[0]=='+'||s[0]=='-')
{
for(*start=1;(s[*start]>='0'&&s[*start]<='9')||s[*start]=='.';(*start)++);
return;
}
for(i=0;i<size;i++)
if(s[i]=='+'||s[i]=='-')
{
*start=i;
return;
}
}

int judge(char* s)//judge意为“判断”
{
int i;
int size=(int)strlen(s);
for(i=1;i<size;i++)
if(s[i]=='+'||s[i]=='-'||s[i]=='*'||s[i]=='/'||s[i]=='!')
return 1;
return 0;
}

void count(char* s)//count意为“计算”
{
int start,i;
char carriage[555];//carriage意为“运载体”
while(judge(s))//判断式子是否还需要进行运算
{
for(i=0;i<(int)strlen(s);i++)//此循环作用是将式子中出现的'--'替换为'+'
{
for(;s[i]!='-' && i<(int)strlen(s);i++);//循环结束
if(s[i+1]=='-')
{
del(s,i,i+1);
needle(s,"+",i);
}

}
find_start(s,&start);//让下标start指向式子应该最先开始处理的运算符
scissor(s,carriage,&start);//用剪刀scissor将start指向的运算符及相对应的操作数剪下并储存在运载体carriage上
handle(carriage);//处理该运载体,并将运载体上运载的式子的计算结果储存在运载体上
needle(s,carriage,start);//见函数simplify中的说明
}
}

void simplify(char* s)//simplify意为“简化”,即将括号去除
{
char carriage[555];//carriage意为“运载体”
int start,end,i;
int size=(int)strlen(s);
while(1)
{
for(i=0;s[i] != '(' && i<size;i++);//注意这里末尾是分号
if(i==size)
break;//说明式子已不含括号,简化完成
for(end=0;s[end] != ')';end++);//使end下标指向式子中第一个出现')'的地方
end--;
for(start=end;s[start] != '(';start--);//寻找与上面一个')'配对的'('
start++;
(s,carriage,start,end);//将括号里的内容复制给运载体carriage
del(s,start-1,end+1);//删除整个括号及其里面的内容
count(carriage);//计算运载体运载的表达式,运算结果储存在运载体上
needle(s,carriage,start-1);//将运载体运载过来的结果用针线needle缝在刚才删除式子s括号及其内容的地方
}
}

int main()
{
int i=0;
char s[555],ch;
puts(" 本程序不对用户输入数据进行检测:");
puts(" 即用户应输入规范的计算式,包括分母不能为0:");
puts(" 式子不能含有空格及其他非计算字符;");
puts(" 按任意一个键开始,按回车键显示运算结果;");
while(1)
{
i++;
ch=getch();
if(Esc==ch)
break;
if(Tab==ch)
{
system("cls");//清除当前屏幕
puts("显示运算结果后:按“Esc”键退出,按“Tab”键清除当前屏幕");
}
if(i==1)
{
system("cls");
puts("显示运算结果后:按“Esc”键退出,按“Tab”键清除当前屏幕");
}
puts("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~");
gets(s);
simplify(s);
count(s);
puts(s);
//实验数据:23.243*(5!-23.123/.133+(2!-13/13.23)*(2!-.235)-((4!-20)!/2!)-32*(3!+2.23/(2*3)!))
//其正确结果是:-5953.9401265774754346182917611489
}
puts("谢谢使用!\n有问题可加q问我:281754179");
getch();
return 0;
}

我记得学了数据结构后我又重新用栈写了个,容错能力会更好,上面的代码可以改进很多,也只是给你一个思路罢了

7. C语言字符串四则运算的实现!求指导

以前写过一个,支持四则运算以及括号运算,采用栈实现
#include<stdio.h>
#include<malloc.h>
#define null 0
#define max 100
typedef struct date /*定义字符栈*/
{
char sk[max];
int top;
}seqstack;
typedef struct da /*定义数据栈*/
{
int sk[max];
int top;
}stack;
void push(seqstack *s,char x) /*进栈*/
{
if(s->top==max-1)
{
printf("out of space.\n");
}
s->top++;
s->sk[s->top]=x;
}
void spush(stack *s,int x) /*进栈*/
{
if(s->top==max-1)
{
printf("sout of space.\n");
}
s->top++;
s->sk[s->top]=x;
}
char pop(seqstack *s ,char c) /*出栈*/
{
if(s->top==-1)
{
printf("no element.\n");return 0;
}
else
{
c=s->sk[s->top];
s->top--;
return c;
}
}
int spop(stack *s ,int c) /*出栈*/
{
if(s->top==-1)
{
printf("sno element.\n");return 0;
}
else
{
c=s->sk[s->top];
s->top--;
return c;
}
}
int pp(char c) /*判断字符*/
{
switch(c)
{
case '#':return 0;break;
case '+':return 2;break;
case '-':return 2;break;
case '*':return 3;break;
case '/':return 3;break;
case '(':return 1;break;
case ')':return 4;break;
default:return 9;break;
}
}
int yunsuan(int a,char b,int c) /*运算*/
{
switch(b)
{
case '+':return a+c;break;
case '-':return a-c;break;
case '*':return a*c;break;
default:
if(c==0) return 0; //除数为0
return a/c;break;
}
}
char bijiao(seqstack *f,char c) /*比较优先级*/
{
int m,n;
char w;
m=pp(c);
w=f->sk[f->top];
n=pp(w);
if(n<m) return '>';
return '<';
}
void main()
{
int x,s;
int q=0,w=0;
int p=0; /*标示变量*/
char ch,th='\0',d='\0';
seqstack *h;
h=(seqstack*)malloc(sizeof(seqstack));
if(!h) printf("no creat");
h->top=-1;
stack *g;
g=(stack*)malloc(sizeof(stack));
if(!g) printf("no door");
g->top=-1;
push(h,'#');
ch=getchar();
while(ch!='\n')
{
if(pp(ch)==9)
{
if(p>0)
{
x=spop(g,x);
spush(g,10*x+ch-48);
}
else
{
spush(g,ch-48);
p++;
}
}
if(pp(ch)==1)
{ push(h,ch);p=0;}
if(pp(ch)==4)
{
while(pp(h->sk[h->top])!=1)
{
q=spop(g,q);
w=spop(g,w);
th=pop(h,th);
spush(g,yunsuan(w,th,q));
}
d=pop(h,d);p=0;
}
if(pp(ch)!=9&&pp(ch)!=1&&pp(ch)!=4)
{
switch(bijiao(h,ch))
{
case '>':push(h,ch);p=0;break;
case '<':
while(pp(h->sk[h->top])>=pp(ch))
{
q=spop(g,q);w=spop(g,w);
th=pop(h,th);
spush(g,yunsuan(w,th,q));
}
push(h,ch); p=0;break;
}
}
ch=getchar();
}
while(ch=='\n'&&h->sk[h->top]!='#')
{
q=spop(g,q);w=spop(g,w);
th=pop(h,th);
s=yunsuan(w,th,q);
spush(g,s);
}
printf("the answer is %d\n",g->sk[g->top]);
}

8. 怎么用C语言编写堆栈并能进行四则运算

3个文件,按您的要求
头文件H
#IFNDEF _XXXX_H
#定义_XXXX_H
#定义错误-1
#定义MAX 100 / *定义堆栈的大小* /
静态int堆栈[MAX]; / *定义一个一维数组堆栈* /
静态int top = 0的; / *自定义堆栈指令* /

诠释推(int i)的;
的pop();

#ENDIF / * _XXXX_H * /

功能文件CPP
#包括“xxxx.h”的

诠释推(I)/ *内存操作数栈操作* /
{
??(顶部<MAX)
???
????栈[+ +顶部] = I / *栈,仍然有空间的堆栈顶部的表示移动一个位置* /
????返回0;
??}
??其他
???
????printf的(“堆栈满了”);
????返回错误;
??}
}
POP()/ *删除的操作数,并弹出操作* /
{
??VAR; / *定义要返回的顶级元素* /
??如果(top! = NULL)/ *仍然堆放元素* /
???
????VAR =栈[ - ] / *堆栈指针向下移动一个位置* /
????返回VAR / *返回的顶部堆栈元素* /
??}
??其他
????printf的(“堆栈是空的!\ n”);
??返回错误;
}

主文件CPP
#包括<stdio.h>
#包括<conio.h>
#包括<stdlib.h>
#包括“xxxx.h”的
无效的主要()
{
??INT M,N;
??字符L;
??整数A,B,C;
??整数K;
??{
????输出(“\ n \ n \ t单击以下提示输入你需要的信息\ n”);
????输出(“\ n \问你输入第二个捣弄数字”);
????scanf的(“%d”,&M);
????推(M)/ *第一个操作数堆栈* /
????输出(“\ n \问你输入第二个捣弄数字”);
????scanf的(“%d”,&N);
????推(N); / *第二个操作数堆栈* /
????输出(“\ n \你不想算术运算(+ / - / * / /):”);
????L = getche(); / *输入操作符* /
????开关(L)/ *确定的运营商,依次执行代码* /
????
??????'+':
????????= pop()方法;
????????= pop()方法;
????????C = A + B;
????????输出(“\ n \ n \ t计算公式为:%d条\ n”,c);
????????输出(“\ n”);
????????;
??????情况下,' - ':
????????= pop()方法;
????????= pop()方法;
????????C = A-B;
????????输出(“\ n \ n \ t计算公式为:%d条\ n”,c);
????????输出(“\ n”);
????????;
??????情况下,'*':
????????= pop()方法;
????????= pop()方法;
????????C = A * B;
????????输出(“\ n \ n \ t计算公式为:%d条\ n”,c);
????????输出(“\ n”);
????????;
??????情况下,'/':
????????= pop()方法;
????????= pop()方法;
????????C = A / B;
????????输出(“\ n \ n \ t计算公式为:%d条\ n”,c);
????????输出(“\ n”);
????????;
????}
????输出(“\ t要继续输入计算吗?(Y / N):”); / *提示用户是否在程序结束* /
????L = getche();
????(L =='N')
??????退出(0);
??}(1);
}

9. c语言中如何用堆栈实现个位数的四则运算(不带括号也可)

#include<iostream>
#include<stdio.h>
#include<math.h>

#define MaxSize 100
using namespace std;
//下面两个函数不是我发明的,数据结构上有
void trans(char*exp,char postexp[])//此函数是将中缀表达式转后缀表达式,利用栈
{
char *temp=exp;
for(;*temp!='\0';temp++){if(*temp=='a')*temp='1';}
struct
{
char data[MaxSize];
int top;
}op;
int i=0;
op.top=-1;
while(*exp!='\0')
{
switch(*exp)
{
case '(':
op.top++;op.data[op.top]=*exp;
exp++;
break;
case ')':
while(op.data[op.top]!='(')
{
postexp[i++]=op.data[op.top];
op.top--;
}
op.top--;
exp++;
break;
case '+':
case '-':
while(op.top!=-1&&op.data[op.top]!='(')
{
postexp[i++]=op.data[op.top];
op.top--;
}
op.top++;op.data[op.top]=*exp;
exp++;
break;
case '*':
case '/':
while(op.data[op.top]=='*'||op.data[op.top]=='/'||op.data[op.top]=='^')
{
postexp[i++]=op.data[op.top];
op.top--;
}
op.top++;op.data[op.top]=*exp;
exp++;
break;
case '^':
while(op.data[op.top]=='^')
{
postexp[i++]=op.data[op.top];
op.top--;
}
op.top++;op.data[op.top]=*exp;
exp++;
break;
case ' '://这里考虑空格了
exp++;
break;
default:
while(*exp>='0'&&*exp<='9')
{
postexp[i++]=*exp;
exp++;
}
postexp[i++]='#';
}
}
while(op.top!=-1)
{
postexp[i++]=op.data[op.top];
op.top--;
}
postexp[i]='\0';
}

float compvalue(char *postexp)//此函数利用栈对后缀表达式求值
{
struct
{
float data[MaxSize];
int top;
}st;
float d,a,b,c;
st.top=-1;
while(*postexp!='\0')
{
switch(*postexp)
{
case '+':
a=st.data[st.top];
st.top--;
b=st.data[st.top];
st.top--;
c=a+b;
st.top++;
st.data[st.top]=c;
break;
case '-':
a=st.data[st.top];
st.top--;
b=st.data[st.top];
st.top--;
c=b-a;
st.top++;
st.data[st.top]=c;
break;
case '*':
a=st.data[st.top];
st.top--;
b=st.data[st.top];
st.top--;
c=a*b;
st.top++;
st.data[st.top]=c;
break;
case '/':
a=st.data[st.top];
st.top--;
b=st.data[st.top];
st.top--;
c=b/a;
st.top++;
st.data[st.top]=c;
break;
case '^':
a=st.data[st.top];
st.top--;
b=st.data[st.top];
st.top--;
c=pow(b,a);
st.top++;
st.data[st.top]=c;
break;
default:
d=0;
while(*postexp>='0'&&*postexp<='9')
{
d=10*d+*postexp-'0';
postexp++;
}
st.top++;
st.data[st.top]=d;
break;
}
postexp++;
}
return(st.data[st.top]);
}

int main()
{
char exp[50],postexp[50],output[50];
int temp,n;
char *X=output,*Y=exp;//临时指针
memset(output,0,50);//这句将全部数组元素置为零
memset(exp,0,50);
cout<<"input:"<<endl;
cin.getline(exp,50);
trans(exp,postexp);
temp=compvalue(postexp);
cin>>n;
fflush(stdin);
for(int i=0;i<n;i++)
{
memset(exp,0,50);
cin.getline(exp,50);
trans(exp,postexp);
if(temp==compvalue(postexp)){*X='A'+i;X++;}//通过指针X来逐个向output元素赋值
}
cout<<"output:"<<endl;
cout<<output<<endl;
return 0;
}