| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 3921 人关注过本帖
标题:计算器(栈),求大神指点
只看楼主 加入收藏
hunterevil
Rank: 1
等 级:新手上路
帖 子:17
专家分:3
注 册:2016-1-12
结帖率:66.67%
收藏
 问题点数:0 回复次数:6 
计算器(栈),求大神指点
在代码中,应该创建两个栈,请问是创建一个char和一个int还是创建两个char型的
搜索更多相关主题的帖子: 计算器 
2016-03-17 11:05
azzbcc
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:江西财经大学
等 级:贵宾
威 望:81
帖 子:3293
专家分:12919
注 册:2012-11-4
收藏
得分:0 
一个数据栈,建议用double吧

一个运算符栈


[fly]存在即是合理[/fly]
2016-03-17 11:18
hunterevil
Rank: 1
等 级:新手上路
帖 子:17
专家分:3
注 册:2016-1-12
收藏
得分:0 
在代码中会定义一个char ch;
然后从键盘上输入一个值,把他赋值给ch,进行判定如果为运算符,则入栈存储运算符的那个栈,否则的话则入栈存储数据的那个栈里。
如果一个栈定义为double,一个定义为char,在把ch入栈的时候有没有什么影响
2016-03-17 13:00
hunterevil
Rank: 1
等 级:新手上路
帖 子:17
专家分:3
注 册:2016-1-12
收藏
得分:0 
回复 2楼 azzbcc
能比能把你的代码给我看一下
2016-03-17 13:03
azzbcc
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:江西财经大学
等 级:贵宾
威 望:81
帖 子:3293
专家分:12919
注 册:2012-11-4
收藏
得分:0 
否则的话则入栈存储数据的那个栈里

遇到两位数或者小数呢?

代码我没有,以前写的太烂所以不保留。


[fly]存在即是合理[/fly]
2016-03-17 16:12
hunterevil
Rank: 1
等 级:新手上路
帖 子:17
专家分:3
注 册:2016-1-12
收藏
得分:0 
那应该怎么办
2016-03-17 18:51
azzbcc
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:江西财经大学
等 级:贵宾
威 望:81
帖 子:3293
专家分:12919
注 册:2012-11-4
收藏
得分:0 
刚写了一个,写的着急,凑合凑合。

程序代码:
#include <stack>
#include <string>
#include <cstdlib>
#include <iostream>
class Calculate
{
private:
    double ans;
    std::string str;
    std::stack<char> operStack;
    std::stack<double> dataStack;
public:
    void clear();
    double calculate();
    char precede(const char a, const char b);
    double oper(const double a, const char ch, const double b);
    friend std::istream& operator>>(std::istream &is, Calculate &cal);
    friend std::ostream& operator<<(std::ostream &os, const Calculate &cal);
};
void Calculate::clear()
{
    ans = 0.0L;
    while (!operStack.empty()) operStack.pop();
    while (!dataStack.empty()) dataStack.pop();
    operStack.push('#');
}
double Calculate::calculate()
{
    this->clear();
    std::string data, ss(str + '#');
    for (size_t i = 0;i != ss.size();i++)
    {
        switch (ss[i])
        {
        case '+':
        case '-':
        case '*':
        case '/':
        case '(':
        case ')':
        case '#':
            if (data.size() != 0)
            {
                dataStack.push(atof(data.c_str()));
                data.clear();
            }
            switch (precede(operStack.top(), ss[i]))
            {
            case '<':
                operStack.push(ss[i]);
                break;
            case '=':
                operStack.pop();
                if (operStack.empty())
                {
                    return ans = dataStack.top();
                }
                break;
            case '>':
                double a = dataStack.top();
                dataStack.pop();
                double b = dataStack.top();
                dataStack.pop();
                dataStack.push(oper(b, operStack.top(), a));
                operStack.pop();
                i--;  // 回退
                break;
            }
            break;
        case '.':
        case '0' ... '9':
            data += ss[i];
            break;
        }
    }
    return ans = 0.0L;
}
char Calculate::precede(const char a, const char b)
{
    std::string str = "+-*/()#";
    char pre[][7] = {
        { '>', '>', '<', '<', '<', '>', '>' },
        { '>', '>', '<', '<', '<', '>', '>' },
        { '>', '>', '>', '>', '<', '>', '>' },
        { '>', '>', '>', '>', '<', '>', '>' },
        { '<', '<', '<', '<', '<', '=', '0' },
        { '>', '>', '>', '>', '0', '>', '>' },
        { '<', '<', '<', '<', '<', '0', '=' } };
    return pre[str.find(a)][str.find(b)];
}
double Calculate::oper(const double a, const char ch, const double b)
{
    double sa(0.0L);
    switch (ch)
    {
    case '+':
        sa = a + b;
        break;
    case '-':
        sa = a - b;
        break;
    case '*':
        sa = a * b;
        break;
    case '/':
        sa = a / b;
        break;
    }
    return sa;
}
std::istream& operator>>(std::istream &is, Calculate &cal)
{
    getline(is, cal.str);
    return is;
}
std::ostream& operator<<(std::ostream &os, const Calculate &cal)
{
    os << cal.str << " = " << cal.ans;
    return os;
}
int main()
{
    Calculate cal;
    std::cin >> cal;
    cal.calculate();
    std::cout << cal.calculate();
    return 0;
}



[此贴子已经被作者于2016-3-18 13:21编辑过]



[fly]存在即是合理[/fly]
2016-03-18 13:10
快速回复:计算器(栈),求大神指点
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.029876 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved