使用c++中的堆栈计算后缀时处理十进制值

Handling decimal values in evaluating postfix using stacks in c++

本文关键字:处理 十进制 后缀 计算 c++ 堆栈 使用      更新时间:2023-10-16

我对发布很陌生,对c++编码也相对陌生。

我的问题涉及:使用c++中的堆栈评估后缀时处理十进制值。这是一项家庭作业,但我已经获得了满足基本要求的代码。我不是在请求帮助做作业。我的教授希望我们强行执行任务,所以我避免了使用<stack>等特殊头文件的许多快捷方式。

我研究过这个问题,对给出的答案不满意。似乎没有其他人像我一样拆分了他们的代码。我在将检测十进制值的内部循环中的值传递给主函数的其余部分时遇到问题。代码编译并运行,但我的最终结果是胡言乱语。我发现一篇帖子说,'return'函数不能传递多个值,但我确实需要至少两个从内部十进制函数返回的值。我不理解'tuple''pair'命令。

我知道这是一个冗长的前奏,但我确实希望任何读者都能理解,我已经阅读了必要的材料,并失去了研究。就我个人而言,我讨厌暴力手段。我知道可能没有及时的回复来帮助我的项目,但我已经为此工作了几个星期。我希望看到这种方法如设想的那样发挥作用。建议和建议非常受欢迎。

这是我的代码链接:链路

这是我的代码:

//*****************************************************************************
// Postfix expression evaluation
// 11/13/2012
// by DJH
//
// all applicable copyrights apply
//
// this program evaluates an input postfix string
// 
// created using Dev-C++ 5.2.0.3
//*****************************************************************************
// ----------------------------------libraries---------------------------------
#include <iostream>                     // For cin, cout and endl
#include <string>
#include <cctype>
#include <vector>
#include <sstream>
#include <cstdlib>
#include <cmath>
#include <iomanip>
using namespace std;
// ------------------------------ Globals -------------------------------------
string postfix;
// --------------------------- stack class ------------------------------------
class Stack {
public:
enum {MaxStack = 50};
void init() {top = -1;}
void push( double p ) {
if ( isFull() ) {
cerr << "Full Stack. DON'T PUSHn";
return;
}
else {
arr[ ++top ] = p;
cout << "Just pushed " << p << endl;
return;}
}
int pop() {
if (isEmpty() ) {
cerr << "tEmpty Stack. Don't Popnn";
return 1;
}
else
return arr[top--];
}
bool isEmpty() {return top < 0 ? 1 : 0;}
bool isFull() {return top >= MaxStack -1 ? top : 0;}
void dump_stack() {
cout << "The Stack contents, from top to bottom, from a stack dump are: " << endl;
for (int s = top; s >= 0; s--)
cout << "tt" << arr[s] << endl;
}
private:
int top;
double arr[MaxStack];
} pStack;
// ------------------------------ end stack class -----------------------------
// -----------------------------function prototypes----------------------------
void evalPostfix( string);
double decimalEvaluate( string, int, double);
// ----------------------------------------------------------------------------
// -----------------------------------Main()-----------------------------------
int main() {
cout << "Enter a postfix expressionnt (without spaces - using '_' for delimiters):nt";
cout << "For example: 8_5_3_+_*_2_/_5_+n" << endl;
getline(cin, postfix);
//  postfix = "7_2_*_5_+_2_*";
cout << "You entered: " << postfix << endl;
int c = 0;
while (postfix[c] != '') {
// this loop counts the characters in the input string including 
// whitespace
++c;
}
cout << "tThe string length is:t" << c << endl;
evalPostfix(postfix);
int result = pStack.pop();
cout << "The result of the postfix expression is: " << result << endl;
/*
stack commands:
Stack a_stack;                  // creates new stack
a_stack.init();                 // initializes top element
a_stack.pop();                  // pops top of stack
a_stack.push(n);                // push element to top of stack
a_stack.dump_stack();           // displays the contents of the stack from top to bottom
*/
return 0;
cin.get();
}
// --------------------------------end of Main()-------------------------------
// ------------------------------functions follow------------------------------
void evalPostfix( string) {
double ch = 0, dc = 0, b = 0, a = 0, d = 0;
double tempDC = 0;
double tempDCD = 0;
char op;
int i = 0, j = 0, k = 0, m = 0, n = 0, q = 0;
while (postfix[i] != '') {
if (postfix[i] == '_') {
i++;
} else if (isdigit(postfix[i])) {
ch = postfix[i] - '0';         // for numbers only
j = i + 1;
while (postfix[j] != '_') {
if (isdigit(postfix[j])) {
ch = ch * 10 + (postfix[j] - '0');
k = j + 1;
// this accounts for decimals by skipping the '.' and
// conducting operations on trailing numbers
if (postfix[k] == '.') {
dc = 0;
decimalEvaluate(postfix, k, dc);
dc = tempDC / tempDCD;
d = ch + dc;
k++;
}
j = k - 1;
j++;
}
}
cout << "Post decimal function k: " << k << endl;
cout << "Post decimal function dc: " << setprecision(12) << dc
<< endl;
cout << "Post decimal function d: " << d << endl;
pStack.push(d);
i = j - 1;
i++;
} else if (postfix[i] == '+' || postfix[i] == '-' || postfix[i] == '*'
|| postfix[i] == '/' || postfix[i] == '^') {
b = pStack.pop();
a = pStack.pop();
op = postfix[i];         // for operators only
switch (op) {
case '+':
pStack.push(a + b);
break;
case '-':
pStack.push(a - b);
break;
case '*':
pStack.push(a * b);
break;
case '^':
pStack.push(pow(a, b));
break;
case '/':
if (b == 0) {
cout << "Division by zero not allowed!" << endl;
cin.get();
exit(0);
}
pStack.push(a / b);
default:
cout << "Invalid Operation" << endl;
}
i++;
}
}
}
// ----------------------------------------------------------------------------
double decimalEvaluate(string postfix, int k, double dc) {
dc = 0;
double tempDC = 0;
double tempDCD = 0;
int n = 0, m = 0, lenDC = 0;
n = k;
while (postfix[n] != '_') {
if ((isdigit(postfix[n])) == false) {
n++;
}
cout << "This step (1) n: " << n << endl;
if (isdigit(postfix[n])) {
m = n;
// assumes characters between a '.' and '_' are all digits
// (may need to check)
while (postfix[m] != '_') {
lenDC++;
// this loop counts the digits in the input trailing a decimal
// point
m++; 
}
cout << "This step (2) m: " << m << endl;
cout << "This step (2) lenDC: " << lenDC << endl;
while ((postfix[n]) != '_') {
tempDC = tempDC * 10 + (postfix[n]) - '0';
n++;
}
cout << "This step (3) n: " << n << endl;
cout << "This step (3) tempDC: " << tempDC << endl;
}
k = n;
tempDCD = pow(10, lenDC);
dc = tempDC / tempDCD;
cout << "This step (4) k: " << k << endl;
cout << "This step (4) tempDCD: " << tempDCD << endl;
cout << "This step (4) tempDC: " << tempDC << endl;
cout << "This step (4) dc: " << dc << endl;
}
return dc, k, tempDC, tempDCD;
}

通过引用传递变量:

void decimalEvaluate (string postfix, int& k, double& dc, double& tempDC, double& tempDCD)
{
tempDC = 0.0;
//...
}