想让大神帮忙看看为什么我这里不能拓展到负数,还有这个为什么不能运行,我学的比较渣

Dennisming 2019-12-11 07:19:36
#include<iostream>
using namespace std;
#include<malloc.h>
#include<math.h>
#define MaxSize 100
typedef char ElemType;
typedef double ElemType1;
typedef struct
{
ElemType data[MaxSize]; //存放栈中的数据元素
int top; //栈顶指针,即存放栈顶元素在data数组中的下标
}SqStack; //顺序栈类型
void InitStack(SqStack * &s) //初始化栈的函数
{
s=(SqStack *)malloc(sizeof(SqStack)); //分配一个顺序栈空间,首地址存放在s中
s->top=-1; //栈顶指针置为-1,表示栈空
}
void DestroyStack(SqStack *&s) //销毁栈的函数
{
free(s);
}
bool StackEmpty(SqStack *s) //判断栈是否为空,该函数实际上用于判断s->top==-1是否成立
{
return(s->top==-1);
}
bool Push(SqStack * &s,ElemType e) //进栈
{
if(s->top==MaxSize-1) //栈满的情况,即栈上溢出
return false;
s->top++; //栈顶指针增1
s->data[s->top]=e; //元素e放在栈顶指针处
return true;
}
bool Pop(SqStack * &s,ElemType &e) //出栈
{
if(s->top==-1) //栈为空的情况,即栈下溢出
return false;
e=s->data[s->top]; //取栈顶元素
s->top--; //栈顶指针减1
return true;
}
bool GetTop(SqStack *s,ElemType &e) //取栈顶元素
{
if(s->top==-1) //栈为空的情况,即栈下溢出
return false;
e=s->data[s->top]; //取栈顶元素
return true;
}
typedef struct
{
ElemType1 data[MaxSize]; //存放栈中的数据元素
int top; //栈顶指针,即存放栈顶元素在data数组中的下标
}SqStack1; //顺序栈类型
void InitStack(SqStack1 * &s) //初始化栈的函数
{
s=(SqStack1 *)malloc(sizeof(SqStack1)); //分配一个顺序栈空间,首地址存放在s中
s->top=-1; //栈顶指针置为-1,表示栈空
}
void DestroyStack1(SqStack1 *&s) //销毁栈的函数
{
free(s);
}
bool StackEmpty(SqStack1 *s) //判断栈是否为空,该函数实际上用于判断s->top==-1是否成立
{
return(s->top==-1);
}
bool Push1(SqStack1 * &s,ElemType1 e) //进栈
{
if(s->top==MaxSize-1) //栈满的情况,即栈上溢出
return false;
s->top++; //栈顶指针增1
s->data[s->top]=e; //元素e放在栈顶指针处
return true;
}
bool Pop1(SqStack1 * &s,ElemType1 &e) //出栈
{
if(s->top==-1) //栈为空的情况,即栈下溢出
return false;
e=s->data[s->top]; //取栈顶元素
s->top--; //栈顶指针减1
return true;
}
bool GetTop1(SqStack1 *s,ElemType1 &e) //取栈顶元素
{
if(s->top==-1) //栈为空的情况,即栈下溢出
return false;
e=s->data[s->top]; //取栈顶元素
return true;
}
void trans(char *exp,char postexp[]) //将算术表达式exp转化成后缀表达式postexp
{
char e;
int i=0;
SqStack*Optr; //定义运算符栈指针
InitStack(Optr); //初始化运算符栈
while( *exp!='\0') //exp表达式未扫描完时循环
{
switch(*exp)
{
case '(': //判定左括号
*exp++;
if(*exp=='-')
{
*exp='@';
exp--;
Push(Optr,'(');
*exp++;
break;
}
else
{
*exp--;
Push(Optr,'('); //左括号进栈
exp++; //继续扫描其他字符
break;
}
case ')': //判定右括号
Pop(Optr,e); //出栈元素e
while(e!='(') //不为(时循环
{
postexp[i++]=e; //将e存放到postexe中
Pop(Optr,e); //出栈元素e
}
exp++; //继续扫描其他字符
break;
case '+': //判定为+或-号
case '-':
while(!StackEmpty(Optr)) //栈不空循环
{
GetTop(Optr,e); //取栈顶元素e
if(e!='(') //e不是'('
{
postexp[i++]=e; //将e存放到postexp中
Pop(Optr,e); //出栈元素e
}
else
break; //e是'('时退出循环
}
Push(Optr,*exp); //将'+'或'-'进栈
exp++; //继续扫描其他字符
break;
case '*': //判定为'*'或'/'号
case '/':
while(!StackEmpty(Optr)) //栈不空循环
{
GetTop(Optr,e); //取栈顶元素e
if(e=='*'||e=='/') //e是'*'或'/'
{
postexp[i++]=e; //将e存放到postexp中
Pop(Optr,e); //出栈元素e
}
else
break; //e是非'*'或'/'时退出循环
}
Push(Optr,*exp); //将'*'或'/'进栈
exp++; //继续扫描其他字符
break;
case '^': //判断为^号
while(!StackEmpty(Optr)) //栈不空循环
{
GetTop(Optr,e); //取栈顶元素e
if(e=='^') //e是'^'
{
postexp[i++]=e; //将e存放到postexp中
Pop(Optr,e); //出栈元素e
}
else
break; //e是非'^'时退出循环
}
Push(Optr,*exp); //将'^'进栈
exp++; //继续扫描其他字符
break;
case 'l': //判断为log号
while(!StackEmpty(Optr)) //栈不空循环
{
GetTop(Optr,e); //取栈顶元素e
if(e=='l') //e是'l'
{
postexp[i++]=e; //将e存放到postexp中
Pop(Optr,e); //出栈元素e
}
else
break; //e是非'l'时退出循环
}
Push(Optr,*exp); //将'l'进栈
exp+=3; //继续扫描其他字符
break;
case'c': //判断为cos号
while(!StackEmpty(Optr)) //栈不空循环
{
GetTop(Optr,e); //取栈顶元素e
if(e=='c') //e是'l'
{
postexp[i++]=e; //将e存放到postexp中
Pop(Optr,e); //出栈元素e
}
else
break; //e是非'c'时退出循环
}
Push(Optr,*exp); //将'c'进栈
exp+=3; //继续扫描其他字符
break;
case's': //判断为sin号
while(!StackEmpty(Optr)) //栈不空循环
{
GetTop(Optr,e); //取栈顶元素e
if(e=='s') //e是's'
{
postexp[i++]=e; //将e存放到postexp中
Pop(Optr,e); //出栈元素e
}
else
break; //e是非's'时退出循环
}
Push(Optr,*exp); //将's'进栈
exp+=3; //继续扫描其他字符
break;
case't': //判断为tan号
while(!StackEmpty(Optr)) //栈不空循环
{
GetTop(Optr,e); //取栈顶元素e
if(e=='t') //e是't'
{
postexp[i++]=e; //将e存放到postexp中
Pop(Optr,e); //出栈元素e
}
else
break; //e是非't'时退出循环
}
Push(Optr,*exp); //将't'进栈
exp+=3; //继续扫描其他字符
break;
default: //处理数字字符
while( *exp>='0'&&*exp<='9'||*exp=='.'||*exp=='@') //判定为数字和小数点字符
{
postexp[i++]= * exp;
exp++;
}
postexp[i++]='#'; //用#标识一个数字串结束
}
}
while(!StackEmpty(Optr)) //此时exp扫描完毕,栈不空时循环
{
Pop(Optr,e); //出栈元素e
postexp[i++]=e; //将e放到postexp中
}
postexp[i]='\0'; //给postexp表达式添加结束的标志
DestroyStack(Optr); //销毁栈
}
double compvalue(char *postexp) //计算后缀表达式的值
{
double d,a,b,c,e;
int n;
int m;
SqStack1*Opnd; //定义操作数栈
InitStack(Opnd); //初始化操作数栈
while( *postexp!='\0') //postexp字符串未扫描完时循环
{
switch( *postexp)
{
case'+': //判定为'+'号
Pop1(Opnd,a); //出栈元素a
Pop1(Opnd,b); //出栈元素b
c=b+a; //计算c
Push1(Opnd,c); //将计算结果c进栈
break;
case'-': //判定为'-'号
Pop1(Opnd,a); //出栈元素a
Pop1(Opnd,b); //出栈元素b
c=b-a; //计算c
Push1(Opnd,c); //将计算结果c进栈
break;
case'*': //判定为'*'号
Pop1(Opnd,a); //出栈元素a
Pop1(Opnd,b); //出栈元素b
c=b*a; //计算c
Push1(Opnd,c); //将计算结果c进栈
break;
case'/': //判定为'/'号
Pop1(Opnd,a); //出栈元素a
Pop1(Opnd,b); //出栈元素b
if(a!=0)
{
c=b/a; //计算c
Push1(Opnd,c); //将计算结果c进栈
break;
}
else
{
printf("\n\t除零错误!\n");
exit(0); //异常退出
}
case'^': //判定为'^'号
Pop1(Opnd,a); //出栈元素a
Pop1(Opnd,b); //出栈元素b
c=pow(b,a); //计算c
Push1(Opnd,c); //将计算结果c进栈
break;
case'l': //判定为log函数
Pop1(Opnd,a); //出栈元素a
Pop1(Opnd,b); //出栈元素b
c=(log(a))/(log(b)); //计算c
Push1(Opnd,c); //将计算结果c进栈
break;
case'c': //判定为cos函数
Pop1(Opnd,a); //出栈元素a
c=cos(a); //计算c
Push1(Opnd,c); //将计算结果c进栈
break;
case's': //判定为sin函数
Pop1(Opnd,a); //出栈元素a
c=sin(a); //计算c
Push1(Opnd,c); //将计算结果c进栈
break;
case't': //判定为tan函数
Pop1(Opnd,a); //出栈元素a
c=tan(a); //计算c
Push1(Opnd,c); //将计算结果c进栈
break;
default:
d=0; //处理数字字符
n=0;
m=0;
while( *postexp>='0'&& *postexp<='9'||*postexp=='.'||*postexp=='@') //判定为数字或者小数点
{
if(*postexp=='@')
{
m--;
*postexp++;
}
d=10*d+ *postexp-'0';
postexp++;
if( *postexp=='.') //处理小数点之后的数字
{
*postexp++; //跳过小数点
n=0; //无论前面n加了多少次,一旦遇到'.'就从小数点之后开始重新计数
}
n++;
}
d=d/pow(10,(n-1)); .
if(m<0)
{
d=0-d;
}
Push1(Opnd,d); //将数值d进栈
break;
}
postexp++; //处理其他字符
}
GetTop1(Opnd,e); //取栈顶元素
DestroyStack1(Opnd); //销毁栈
return e; //返回e
}
void behind(char*postexp) //输出后缀表达式
{
int t;
t=strlen(postexp);
for(int i=0;i<t;i++)
{
if(*(postexp+i)=='s') {cout<<"sin";continue;}
if(*(postexp+i)=='l') {cout<<"log";continue;}
if(*(postexp+i)=='c') {cout<<"cos";continue;}
if(*(postexp+i)=='t') {cout<<"tan";continue;}
if(*(postexp+i)=='@') {cout<<"-";continue;}
cout<<*(postexp+i);
}
cout<<endl;
}
int main()
{
cout<<"*-- 请输入算术表达式 --*"<<endl;
cout<<"************************"<<endl;
char exp[MaxSize];
char postexp[MaxSize];
while(1==1)
cin>>exp; //输入算术表达式
trans(exp,postexp);
cout<<"中缀表达式:"<<exp<<endl;
cout<<"后缀表达式";
behind(postexp);
cout<<"表达式的值"<<compvalue(postexp)<<endl;
return 1;

}
...全文
56 回复 打赏 收藏 转发到动态 举报
写回复
用AI写文章
回复
切换为时间正序
请发表友善的回复…
发表回复

16,551

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • AIGC Browser
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

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