除非. 2021-12-17 09:46 采纳率: 100%
浏览 16
已结题

栈链四则运算 要求输入字母就报错 应该怎么写

#define MaxSize 30
#include
#include <stdlib.h>
using namespace std;
typedef float datatype;
typedef char chartype;

//定义栈格式
typedef struct node
{
int flag; //标记位,1为浮点数,2为字符型
datatype num;
chartype sign;
node* next;
}node;

typedef struct Sqstack
{
node *Top;
}SqStack;

//构造一个空栈
void InitStack(SqStack *& S);

//置空栈
void SetNull(SqStack S);

//判断栈空
int Empty(SqStack
S);

//出栈
void Pop(SqStack *S,datatype &e);
void Pop(SqStack *S,chartype &e);
//入栈
void Push(SqStack *S,datatype n);
void Push(SqStack *S,chartype s);
//
void GetTop(SqStack *S,datatype &e);
void GetTop(SqStack S,chartype &e);
//判断是否为字符型,是返回1,否返回0
int CharOrNot(char ch);
//输入表达式保存
void GetExpression(SqStack &S);
//输入输出对换
void ReturnStack(SqStack &S);
//四则运算
datatype EvaluateExpression(SqStack C);
//自带输入的四则运算
datatype EvaluateExpression();
//判断优先级
chartype Precede(chartype a,chartype b);
//对相关运算进行封装,返回运算结果
datatype Operate(datatype a,chartype b,datatype c);

//构造一个空栈
void InitStack(SqStack & S)
{
S = (SqStack
)malloc(sizeof(SqStack));
S->Top = NULL;
}

//置空栈
void SetNull(SqStack S)
{
node
p = NULL;
while(S->Top != NULL)
{
p = S->Top;
S->Top = p->next;
free(p);p = NULL;
}
//cout<<"置空成功"<<endl;
}

//判断栈空,空返回1
int Empty(SqStack*S)
{
if(S->Top<=0) return 1;
else return 0;
}

//入栈
void Push(SqStack *S,datatype n)
{
node *p = (node*)malloc(sizeof(node));
if(p != NULL)
{
p->flag = 1;
p->num = n;
p->next = S->Top;
S->Top = p;
//cout<<"Num入栈成功:"<num<<endl;
}
else
cout<<"Error"<<endl;
}
//入栈
void Push(SqStack *S,chartype s)
{
node *p = (node*)malloc(sizeof(node));
if(p != NULL)
{
p->flag = 2;
p->sign = s;
p->next = S->Top;
S->Top = p;
//cout<<"Sign入栈成功:"<sign<<endl;
}
else
cout<<"Error"<<endl;
}

//出栈
void Pop(SqStack *S,datatype &e)
{
if(S->Top != NULL)
{
node
p = S->Top;
e = p->num;
S->Top = p->next;
free(p);
//cout<<"出栈成功: "<<e<<endl;
}
else {}
}
void Pop(SqStack *S,chartype &e)
{
if(S->Top != NULL)
{
node
p = S->Top;
e = p->sign;
S->Top = p->next;
free(p);
//cout<<"出栈成功: "<<e<<endl;
}
else {}
}

//获得栈顶元素
void GetTop(SqStack *S,chartype &e)
{
if(S->Top != NULL)
e = S->Top->sign;
else {}
}
void GetTop(SqStack S,datatype &e)
{
if(S->Top != NULL)
e = S->Top->num;
else {}
}

//判断运算符为真返回1
int CharOrNot(char ch)
{
if(ch!='+'&&ch!='-'&&ch!='
'&&ch!='/'&&ch!='('&&ch!=')'&&ch!='#')
return 0;
else return 1;
}
//获取表达式
void GetExpression(SqStack &S)
{
cout<<"请输入计算题:(请在计算式后面加#符号结束)"<<endl;
char ch=0;
ch = getchar();
while (ch !='\n')
{
if(CharOrNot(ch))//为字符
{
Push(S,ch);
ch = getchar();
}
else
{
datatype k=1;
datatype m=datatype(ch)-48;
ch = getchar();
while(ch!='.' && !CharOrNot(ch))
{
m=m
10+int(ch)-48;
ch = getchar();
}
if(ch=='.') ch=getchar();
while(!CharOrNot(ch))
{
k=0.1
k;
m=m+k
(int(ch)-48);
ch = getchar();
}
Push(S,m);
}
}
//cout<<"输入完毕"<<endl;
}

//变换顺序
void ReturnStack(SqStack *&S)
{
SqStack *Q;node *p;
InitStack(Q);
datatype a;chartype b;

while(S->Top!=NULL)
{
    p=S->Top;
    S->Top = p->next;
    p->next = Q->Top; 
    Q->Top=p;
}
S->Top = Q->Top;
Q->Top = NULL;
free(Q);
//cout<<"转变完成"<<endl;

}

//输入栈处理
datatype EvaluateExpression(SqStack *C)
{
SqStack *S,*Q;node *p;
InitStack(S);InitStack(Q);
Push(Q,'#'); //作为结束判断的标志
chartype b='!';datatype a;datatype c;
//当最后一个和第一个元素都为#时结束
while(p->sign!='#' || b!='#')
{
if(p->flag == 1)//flag = 1 为数字
{
Push(S,p->num);p=p->next;//进入数字栈
}
else if(p->flag == 2) //为字符
{
GetTop(Q,b);
//通过switch判断需要做的操作
switch(Precede(b,p->sign)){
case'<'://栈顶符号优先级小于当前符号
Push(Q,p->sign);//对当前进行进栈操作
p=p->next;//p指向下一个节点
break;
case'='://脱括号
Pop(Q,b);//出栈
p=p->next;//p指向下一个节点
break;
case'>':// 栈顶符号优先级大于当前符号
Pop(Q,b);//出栈操作符
Pop(S,a);//得到第二个数字
Pop(S,c);//得到第一个数字
Push(S,Operate(a,b,c));//将运算结果进栈
break;
}
}
GetTop(Q,b);//更新 b 为栈顶元素符号,方便判断
}
GetTop(S,a);//结束循环,返回数字栈结果
SetNull(S);SetNull(Q);//置空
free(S);free(Q);free(p);//释放栈格式

return a;//返回结果

}


//判断优先级
chartype Precede(chartype a,chartype b)
{
int m,n;
switch(a)
{
case '#': m=0;break;
case '-':
case '+': m=2;break;
case '':
case '/': m=3;break;
case '(': m=1;break;
//default
//case')': m=3;
}
switch(b)
{
case '#': n=0;break;
case '-':
case '+': n=2;break;
case '
':
case '/': n=3;break;
case '(': n=4;break;
case ')': n=1;break;
//default
}

if(m<n)
a='<';
else if(m==n && m == 1)//脱括号
a='=';
else if(m==n &&m != 0 && m!= 1 || m>n)
a='>';

return a;

}

datatype Operate(datatype a,chartype b,datatype c)
{
switch(b)

  • 写回答

1条回答 默认 最新

  • CSDN专家-sinJack 2021-12-17 09:48
    关注

    输入字母就报错?
    那你判断输入的是否是字母,是字母就抛出异常。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

问题事件

  • 系统已结题 12月25日
  • 已采纳回答 12月17日
  • 创建了问题 12月17日

悬赏问题

  • ¥15 msix packaging tool打包问题
  • ¥15 finalshell节点的搭建代码和那个端口代码教程
  • ¥15 用hfss做微带贴片阵列天线的时候分析设置有问题
  • ¥50 我撰写的python爬虫爬不了 要爬的网址有反爬机制
  • ¥15 Centos / PETSc / PETGEM
  • ¥15 centos7.9 IPv6端口telnet和端口监控问题
  • ¥120 计算机网络的新校区组网设计
  • ¥20 完全没有学习过GAN,看了CSDN的一篇文章,里面有代码但是完全不知道如何操作
  • ¥15 使用ue5插件narrative时如何切换关卡也保存叙事任务记录
  • ¥20 海浪数据 南海地区海况数据,波浪数据