qq_38349395 2017-11-05 03:33 采纳率: 0%
浏览 445

C++用栈进行表达式运算,控制台无输出?求助0.0

#include
#include
#include
#include
using namespace std;
typedef int Rank;
typedef enum { ADD, SUB, MUL, DIV, POW, FAC, L_P, R_P, EOE }Operator;
#define N_OPTR 9
#define default_capacity 10
templateclass Vector {
public:
Rank _size;
int _capacity;
T*_elem;

Vector(int s = 0, T v = 0, int c = default_capacity)
{
_elem = new T[_capacity = c];
for (_size = 0; _size < s; _size++) {
_elem[_size] = v;
}

}
T&operator[](Rank r)const
{
    return _elem[r];
}
Rank size()
{
    return _size;
}
int remove(Rank lo, Rank hi)
{
    if (lo == hi)
    {
        return 0;
    }
    while (hi < _size)
    {
        _elem[lo++] = _elem[hi++];
        _size = lo;
        return hi - lo;
    }
}
T remove(Rank r)
{
    T e = _elem[r];
    remove(r, r + 1);
    return e;
}
bool empty() const{
    return !_size;

}
void expand()
{
    if (_size < _capacity)
    {
        return;
    }
    if (_size < default_capacity)
    {
        _capacity = default_capacity;
    }
    T* oldelem = _elem;
    _elem = new T[_capacity <<= 1];
    for (int i = 0; i < _size; i++)
    {
        _elem[i] = oldelem[i];
    }
    delete [] oldelem;
}
Rank insert(Rank r, T const& e)
{
    expand();
    for (int i = _size; i > r; i--)
    {
        _elem[i] = _elem[i - 1];
    }
    _elem[r] = e;
    _size++;
    return r;
}

};
templateclass Stack :public Vector {
public:
void push(T const& e)
{
insert(size(), e);
}
T pop() {
return remove(size() - 1);
}
T& top()
{
return (*this)[size() - 1];
}
};
double calcu2(int a,char ch,int b)
{
switch (ch)
{
case'+':
return a + b;
case'-':
return a - b;
case'*':
return a*b;
case'/':
return a / b;
case'^':
return pow(a, b);

}

}
const char pri[N_OPTR][N_OPTR] = {
'>','>','<','<','<','<','<','>','>',
'>','>','<','<','<','<','<','>','>',
'>','>','>','>','<','<','<','>','>',
'>','>','>','>','<','<','<','>','>',
'>','>','>','>','>','<','<','>','>',
'>','>','>','>','>','>',' ','>','>',
'<','<','<','<','<','<','<','=',' ',
' ',' ',' ',' ',' ',' ',' ',' ',' ',
'<','<','<','<','<','<','<',' ','=',
};
Operator getop(char ch)
{
switch (ch)
{
case'+':
return ADD;
case'-':
return SUB;
case'*':
return MUL;
case'/':
return DIV;
case'^':
return POW;
case'!':
return FAC;
case'(':
return L_P;
case')':
return R_P;
case'#':
return EOE;

}

}
char order(char op1, char op2)
{
return pri[getop(op1)][getop(op2)];
}
int step(int x)
{
int k = 1;
if (x == 1)
{
return 1;
}
k = x*step(x - 1);
return k;
}
int calcu(char ch, int x)
{
switch (ch)
{
case'!':
return step(x);
}
}

int evaluate(char* S)
{
Stackopnd;
Stackoptr;
optr.push('#');
while (!optr.empty())
{
if (isdigit(*S))
{
opnd.push(*S);
}
else
switch (order(optr.top(), S)) {
case'<':
optr.push(*S);
S++;
break;
case'=':
optr.pop();
S++;
break;
case'>':
char op = optr.pop();
if ('!' == op)
{
int popnd = opnd.pop();
opnd.push(calcu(op, popnd));
}
else {
int popnd2 = opnd.pop();
int popnd3 = opnd.pop();
opnd.push(calcu2(popnd2, op, popnd3));
}
break;

}
}

return opnd.pop();
}
int main()
{
char
S=“2+3^2";

cout << evaluate(S) << endl;
system("pause");
return 0;

}

  • 写回答

1条回答 默认 最新

  • ChatGPTᴼᴾᴱᴺᴬᴵ 2023-03-01 13:20
    关注

    该回答引用ChatGPT

    首先,在您的代码中,定义变量 S 的方式是不正确的。如果您想定义一个字符串,请使用双引号 " ",而不是单引号 ' '。


    其次,您在 main() 函数中声明的字符串 S 类型为 char,但是 evaluate() 函数的参数类型应该是 char*,即一个指向字符数组的指针。您需要将 S 的类型更改为 char*


    最后,在 main() 函数中,您将字符串 S 定义为 "2+3^2",但是您的代码中没有处理空格的逻辑,所以将此字符串更改为 "2+3^2#",并将其作为参数传递给 evaluate() 函数。在字符串的末尾添加 # 可以确保在处理表达式时不会越界。

    评论

报告相同问题?

悬赏问题

  • ¥30 python代码,帮调试
  • ¥15 #MATLAB仿真#车辆换道路径规划
  • ¥15 java 操作 elasticsearch 8.1 实现 索引的重建
  • ¥15 数据可视化Python
  • ¥15 要给毕业设计添加扫码登录的功能!!有偿
  • ¥15 kafka 分区副本增加会导致消息丢失或者不可用吗?
  • ¥15 微信公众号自制会员卡没有收款渠道啊
  • ¥100 Jenkins自动化部署—悬赏100元
  • ¥15 关于#python#的问题:求帮写python代码
  • ¥20 MATLAB画图图形出现上下震荡的线条