字符串提取

duoniK 2013-11-28 05:37:55
输入一个字符串 例: 5*(12-3)+3;
如何将字符串中 数字 与 符号相分离,使得对该字符串读取 每次得到一个 数或一个 符号
第一次 数字:5
第二次 符号:*
第三次 符号:(
第四次 数字:12
....
...全文
138 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
还有多远 2013-11-28
  • 打赏
  • 举报
回复
抛砖引玉,仅供参考

string& removeSpaceCopy(string& dest, const string& src);
void getOperand(vector<string>& operandVec, char*& p, bool startWithSign = false);
bool isParenthese(c);
bool isOperator(c);

void separate(vector<string>& operandVec, vector<char>& operatorVec, const string& src)
{
    string exp;
    removeSpaceCopy(exp, src);
    
    char *p, c;
    for(p = exp.c_str(); c = *p; ){
        if(isdigit(c)) getOperand(operandVec, p);
        else if(isParenthese(c)){
            operatorVec.push_back(c);
            ++p;
        }
        else if(isOperator(c)){
            if(!operatorVec.empty() && operatorVec.back() == '('){
		if(c == '+' || c == '-') getOperand(operandVec, p, true);
		else{
		    //illegal expression
		}
            }
            else{
                operatorVec.push_back(c);
                ++p;
            }
        }
        else{
            //illegal expression
        }
    }
}
ForestDB 2013-11-28
  • 打赏
  • 举报
回复
从输入流提取token先
Adol1111 2013-11-28
  • 打赏
  • 举报
回复
google一下逆波兰表达式
Walle_Oyq 2013-11-28
  • 打赏
  • 举报
回复
先建栈,然后把元素全部压进去,然后开始逐一读取,建议数组缓冲区,如果是字符,输出,如果是数字,进入数组缓冲区,如果下一个还是数字,继续放进去(当然要按照先后秩序),如果下一个是字符, 则将数组里面的数字取出来,输出,然后将字符继续输出。依次类推。。。。
忘世麒麟 2013-11-28
  • 打赏
  • 举报
回复
引用 4 楼 duoniK 的回复:
5*(12-3) 第2 '*' 和3 '('个元素都是符号啊
抱歉我看错了,那可以在存入的时候做一下判断,或者在提取的时候做一下判断。不妨使用两个栈。一个存数据一个存入符号。
忘世麒麟 2013-11-28
  • 打赏
  • 举报
回复
引用 4 楼 duoniK 的回复:
5*(12-3) 第2 '*' 和3 '('个元素都是符号啊
下标从0开始,而且注意使用栈的时候“12”是一个元素。
duoniK 2013-11-28
  • 打赏
  • 举报
回复
5*(12-3) 第2 '*' 和3 '('个元素都是符号啊
yang3wei 2013-11-28
  • 打赏
  • 举报
回复
不懂,坐等高手支招,顺便拿每日可用分10分
忘世麒麟 2013-11-28
  • 打赏
  • 举报
回复
引用 1 楼 baijiaheizhiganmao 的回复:
愿意使用算法的话我建议写一个栈。全部入栈后,奇数次和偶数次pop的分别是数字和符号,或者相反。 当然也可以使用vector,原理基本相同。
还可以使用string,如string temp=“5*(12-3)+3”;则temp[0]为5,【1】为*即偶数下标和奇数下标获得的分别时数字和字符。
忘世麒麟 2013-11-28
  • 打赏
  • 举报
回复
愿意使用算法的话我建议写一个栈。全部入栈后,奇数次和偶数次pop的分别是数字和符号,或者相反。 当然也可以使用vector,原理基本相同。

64,648

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧