这个输出结果是一个问号,这是为什么中间的过程应该是没有问题的啊。
1条回答 默认 最新
- 技术专家团-小桥流水 2022-04-25 17:19关注
代码修改如下:
stack.h 没改:#pragma once #include <iostream> using namespace std; class stack { public: stack(); ~stack(); void clearstack(); //清空 int isempty(); //判空 int length(); //求长度 char gettop(); //取栈顶元素 int push(char); //进栈 int pop(char*); //出栈 int traverse(); //遍历 protected: int* base; //栈底指针 int* top; //栈顶指针 int size; // };
stack.cpp(改动不大):
#include "stack.h" //static int a = 20; //这里不要用静态变量,而且跟计算器.cpp中的全局变量重名了 #define MAXSIZE 20 stack::stack() { top = base = new int[MAXSIZE]; size = MAXSIZE; } stack::~stack() { delete[] base; //修改 } void stack::clearstack() { top = base; return; } int stack::isempty() { return top == base ? 1 : 0; } int stack::length() { return size; } char stack::gettop() { return *(top - 1); } int stack::push(char s) { if (top - base == size) { cout << "栈已满!" << endl; return 0; } *top = s; top++; return 1; } int stack::pop(char* s) { if (top == base) { cout << "栈为空!" << endl; return 0; } *s = *(top - 1); top--; return 1; } int stack::traverse() { for (int i = 1; i <= top - base; i++) { cout << (char) * (top - i) << " "; } return 1; }
计算器.cpp:
#include "stack.h" int prior[5][5] = { {1,1,2,2,1}, {1,1,2,2,1}, {1,1,1,1,1}, {1,1,1,1,1}, {2,2,2,2,0} }; char a[5] = { '+','-','*','/','#' }; int get(char s) { int i = 0; for (i = 0; i < 5; i++) { if (s == a[i]) break; } return i; } char calculate(stack &s, stack &s1) //修改,用引用 { char a = '0', b = '0'; char tt; s.pop(&a); s.pop(&b); //上面两个pop最好判断是否成功 if (s1.gettop() == '+') { s1.pop(&tt); //s1.traverse(); return a - '0' + b - '0' + '0'; } else if (s1.gettop() == '-') { s1.pop(&tt); //s1.traverse(); return a - '0' + (b - '0') + '0'; } else if (s1.gettop() == '*') { s1.pop(&tt); //s1.traverse(); return (a - '0') * (b - '0') + '0'; } else if (s1.gettop() == '/') { s1.pop(&tt); //s1.traverse(); return (a - '0') / (b - '0') + '0'; } return 0; } int main() { stack opnd, optr; char s[20]; cout << "请输入一个以#开头结尾的表达式:"; cin >> s; int i = 0; char a1 = 0; //这个跟全局变量a也重名了 optr.push('#');//把第一个#放入optr for (i=1; s[i] != '\0';i++) //从1开始 { if (s[i] >= '0' && s[i] <= '9') { opnd.push(s[i]); } else { while (!optr.isempty()) { int index = get(optr.gettop()); if (prior[index][get(s[i])] == 1) //这里应该是optr { a1 = calculate(opnd, optr); opnd.push(a1); } else if (prior[index][get(s[i])] == 2) { optr.push(s[i]); //optr.traverse(); break; } else if (prior[index][get(s[i])] == 0) { break; } } } } cout << opnd.gettop(); return 0; }
解决 无用评论 打赏 举报 编辑记录
悬赏问题
- ¥15 数学建模招标中位数问题
- ¥15 phython路径名过长报错 不知道什么问题
- ¥15 深度学习中模型转换该怎么实现
- ¥15 HLs设计手写数字识别程序编译通不过
- ¥15 Stata外部命令安装问题求帮助!
- ¥15 从键盘随机输入A-H中的一串字符串,用七段数码管方法进行绘制。提交代码及运行截图。
- ¥15 TYPCE母转母,插入认方向
- ¥15 如何用python向钉钉机器人发送可以放大的图片?
- ¥15 matlab(相关搜索:紧聚焦)
- ¥15 基于51单片机的厨房煤气泄露检测报警系统设计