在线等,求大神帮忙

slinking slinking 墨衍会员 · AI 创作全网分发 墨衍智能分发 通过墨衍一键同步至各平台 可同步平台 CSDN微信公众号微博知乎掘金百家号博客园抖音小红书 你的文章也可以这样分发 墨衍会员 ¥399起/年,写一次发全网 我也要 + 加入社区
程序如下(感觉没错误啊):
#include <stdio.h>
#include <malloc.h>
#include <stdlib.h>
#include <iostream>
using namespace std;
#define OK 1
#define ERROR 0
#define STACK_INIT_SIZE 1000
double result, number1,number2;
int i, j,n,m,flag;
char operate,ch;
char val[100];
//操作数栈定义
typedef struct{
double *base;
double *top;
int stacksize;
}numstack;
//操作码栈定义
typedef struct{
char *base;
char *top;
char stacksize;
}pondstack;
//操作数栈初始化
int num_init(numstack &S)
{
S.base = (double *)malloc(STACK_INIT_SIZE*sizeof(double));
if (!S.base)exit(OVERFLOW);
S.top=S.base;
S.stacksize = STACK_INIT_SIZE;
return OK;
}
//操作码栈初始化
int pond_init(pondstack &S)
{
S.base = (char *)malloc(STACK_INIT_SIZE*sizeof(char));
if (!S.base)exit(OVERFLOW);
S.top = S.base;
S.stacksize = STACK_INIT_SIZE;
return OK;
}
//将操作码压入堆栈
int push_pond(pondstack &S, char c)
{
*S.top++ = c;
return OK;
}
//将操作数压入堆栈
int push_num(numstack &S, double number)
{
*S.top++=number;
return OK;
}
//将操作码弹出堆栈
int pop_pond(pondstack S)
{
char c;
if (S.top == S.base)return ERROR;
c = *--S.top;
return c;
}
//将操作数弹出堆栈
int pop_num(numstack S)
{
double e;
if (S.top == S.base)return ERROR;
e = *--S.top;
return e;
}
//取栈顶
int get_top(pondstack N)
{
char c;
if (N.top == N.base)return ERROR;
c = *(N.top - 1);
return c;
}
//判断对错
int judge(char c)
{
if (c =='-' || c == '*' || c == '/' || c == '+')flag = 1;//c为运算符时flag=1;
else flag = 0;
return OK;
}
//优先级判别
int change_opnd(char c)
{
switch (c)
{
case '-':
case '+':m= 1; break;
case '*':
case '/':m= 2; break;
default: printf("error");
}
return(m);
}
//简单计算+,-,*,/
int caculate(double numbe1,char operat,double numbe2)
{
if (operate == '+')
{
result = numbe1 + numbe2;
}
if (operat == '-')
{
result = numbe1 - numbe2;
}
if (operat == '*')
{
result = numbe1*numbe2;
}
if (operat == '/')
{
result = numbe1 / numbe2;
}
return result;
}
//语法检查并计算
int Make_str()
{
numstack num;
pondstack pond;
num_init(num);//操作数栈num
pond_init(pond);//操作码栈pond
//输入判断进栈
for (n = 0; val[n] != '='; n++)
{
judge(val[n]);
if (flag == 0)push_num(num, val[n]);
else
{
if (pond.top == pond.base)push_pond(pond, val[n]);
else
{
int x, y;
x = change_opnd(val[n]);
y = change_opnd(ch = get_top(pond));
if (x > y)push_pond(pond, val[n]);//栈顶元素优先权低,直接进栈
else//栈顶元素优先权高,退栈运算结果进栈
{
number1=pop_num(num );
operate=pop_pond(pond);
number2=pop_num(num);
push_pond(pond,caculate(number1, operate, number2));
}
}
}
}
while (pond.top != pond.base)
{
number1 = pop_num(num);
operate = pop_pond(pond);
number2 = pop_num(num);
push_pond(pond, caculate(number1, operate, number2));
}
result=pop_num(num);
cout << result;
return OK;
}
//主函数
void main()
{
cout << "*****************运算表达式判断及运算结果********************" << endl;
Make_str();
}

调试时错误:0x01226CB9 处有未经处理的异常(在 shiyan2.3.exe 中): 0xC0000005: 写入位置 0x0047A000 时发生访问冲突。
在*S.top++=number;这。。。。不懂啊,指针不对吗?
在线等,谢谢了
...全文

相关推荐

评论 2
收藏 已收藏
分享
返回顶部
slinking
C++ 语言 65,214 成员 250,514 内容