【OJ练习】并行计算器
2015-10-19 04:29
253 查看
#include<iostream>
#include<vector>
#include<string>
#include<algorithm>
using namespace std;
typedef enum NumType
{
Add,
Multi,
REV
}enNumType;
typedef struct NumNode
{
enNumType OperatorPyte;
vector<int> Num;
}strNumNode;
void CopyNumToQueue( char *InputChar, vector<strNumNode> &NumQueue );
void SortNumQueue( vector<strNumNode> &NumQueue );
int main()
{
char InputChar[100] = "1+7+3+2*3+4*7*5+9*2+4*3*2*6+4";
//char InputChar[100] = "1+3+2*3+4";
//char InputChar[100] = "1";
//char InputChar[100] = "2+3";
//char InputChar[100] = "2*3";
int IntputNum = sizeof(InputChar);
cout<<IntputNum<<endl;
IntputNum = strlen(InputChar);
cout<<IntputNum<<endl;
vector<strNumNode> NumQueue;
/*将表达式数字按加法和乘法分别存入不同节点*/
CopyNumToQueue( InputChar, NumQueue);
while( ( NumQueue.size() > 1 ) || ( NumQueue[0].Num.size() > 1 ) )
{
/*节点内部数字排序,外部字典序排序*/
SortNumQueue( NumQueue );
}
return 0;
}
void CopyNumToQueue( char *InputChar, vector<strNumNode> &NumQueue )
{
enNumType PreOperator = Add;
enNumType NextOperator;
int TempNum;
int MultiNum = 0;
strNumNode TempNumNode;
TempNumNode.OperatorPyte = Add;
NumQueue.push_back( TempNumNode );
for( int i = 0; i < strlen(InputChar); i += 2 )
{
TempNum = atoi( &InputChar[i] );
if( i == ( strlen(InputChar) - 1 ) )
{
if( PreOperator == Add )
{
NumQueue[0].Num.push_back(TempNum);
}
else
{
NumQueue[MultiNum].Num.push_back(TempNum);
}
}
else
{
/*判断下一个运算符*/
( InputChar[i+1] == '+' ) ? ( NextOperator = Add ) : ( NextOperator = Multi );
/* a+b+c 保存b */
if( ( PreOperator == Add ) && ( NextOperator == Add ) )
{
NumQueue[0].Num.push_back(TempNum);
}
/* a+b*c 保存b */
else if( ( PreOperator == Add ) && ( NextOperator == Multi ) )
{
TempNumNode.OperatorPyte = Multi;
NumQueue.push_back( TempNumNode );
MultiNum++;
NumQueue[MultiNum].Num.push_back(TempNum);
}
/* a*b*c 和 a*b+c 保存b */
else
{
NumQueue[MultiNum].Num.push_back(TempNum);
}
PreOperator = NextOperator;
}
}
}
bool SortFun(const strNumNode &Node1, const strNumNode &Node2 )
{
if( Node1.Num.size() < Node2.Num.size() )
{
return true;
}
else if( Node1.Num.size() == Node2.Num.size() )
{
for( int i = 0; i < Node1.Num.size(); i++ )
{
if( Node1.Num[i] < Node2.Num[i] )
{
return true;
}
else if( Node1.Num[i] > Node2.Num[i] )
{
return false;
}
else
{
}
}
return true;
}
else
{
return false;
}
}
void SortNumQueue( vector<strNumNode> &NumQueue )
{
/*对所有节点内部的数字从小到大排序*/
for( int i = 0; i < NumQueue.size(); i++ )
{
sort( NumQueue[i].Num.begin(), NumQueue[i].Num.end());
}
/*对乘法节点进行字典序排序*/
sort( ( NumQueue.begin() + 1 ), NumQueue.end(), SortFun );
}
#include<vector>
#include<string>
#include<algorithm>
using namespace std;
typedef enum NumType
{
Add,
Multi,
REV
}enNumType;
typedef struct NumNode
{
enNumType OperatorPyte;
vector<int> Num;
}strNumNode;
void CopyNumToQueue( char *InputChar, vector<strNumNode> &NumQueue );
void SortNumQueue( vector<strNumNode> &NumQueue );
int main()
{
char InputChar[100] = "1+7+3+2*3+4*7*5+9*2+4*3*2*6+4";
//char InputChar[100] = "1+3+2*3+4";
//char InputChar[100] = "1";
//char InputChar[100] = "2+3";
//char InputChar[100] = "2*3";
int IntputNum = sizeof(InputChar);
cout<<IntputNum<<endl;
IntputNum = strlen(InputChar);
cout<<IntputNum<<endl;
vector<strNumNode> NumQueue;
/*将表达式数字按加法和乘法分别存入不同节点*/
CopyNumToQueue( InputChar, NumQueue);
while( ( NumQueue.size() > 1 ) || ( NumQueue[0].Num.size() > 1 ) )
{
/*节点内部数字排序,外部字典序排序*/
SortNumQueue( NumQueue );
}
return 0;
}
void CopyNumToQueue( char *InputChar, vector<strNumNode> &NumQueue )
{
enNumType PreOperator = Add;
enNumType NextOperator;
int TempNum;
int MultiNum = 0;
strNumNode TempNumNode;
TempNumNode.OperatorPyte = Add;
NumQueue.push_back( TempNumNode );
for( int i = 0; i < strlen(InputChar); i += 2 )
{
TempNum = atoi( &InputChar[i] );
if( i == ( strlen(InputChar) - 1 ) )
{
if( PreOperator == Add )
{
NumQueue[0].Num.push_back(TempNum);
}
else
{
NumQueue[MultiNum].Num.push_back(TempNum);
}
}
else
{
/*判断下一个运算符*/
( InputChar[i+1] == '+' ) ? ( NextOperator = Add ) : ( NextOperator = Multi );
/* a+b+c 保存b */
if( ( PreOperator == Add ) && ( NextOperator == Add ) )
{
NumQueue[0].Num.push_back(TempNum);
}
/* a+b*c 保存b */
else if( ( PreOperator == Add ) && ( NextOperator == Multi ) )
{
TempNumNode.OperatorPyte = Multi;
NumQueue.push_back( TempNumNode );
MultiNum++;
NumQueue[MultiNum].Num.push_back(TempNum);
}
/* a*b*c 和 a*b+c 保存b */
else
{
NumQueue[MultiNum].Num.push_back(TempNum);
}
PreOperator = NextOperator;
}
}
}
bool SortFun(const strNumNode &Node1, const strNumNode &Node2 )
{
if( Node1.Num.size() < Node2.Num.size() )
{
return true;
}
else if( Node1.Num.size() == Node2.Num.size() )
{
for( int i = 0; i < Node1.Num.size(); i++ )
{
if( Node1.Num[i] < Node2.Num[i] )
{
return true;
}
else if( Node1.Num[i] > Node2.Num[i] )
{
return false;
}
else
{
}
}
return true;
}
else
{
return false;
}
}
void SortNumQueue( vector<strNumNode> &NumQueue )
{
/*对所有节点内部的数字从小到大排序*/
for( int i = 0; i < NumQueue.size(); i++ )
{
sort( NumQueue[i].Num.begin(), NumQueue[i].Num.end());
}
/*对乘法节点进行字典序排序*/
sort( ( NumQueue.begin() + 1 ), NumQueue.end(), SortFun );
}
相关文章推荐
- 3 Sum Closest 解答
- composer安装yii2或者laravel报错
- 解决Win7下运行php Composer出现SSL报错的问题
- UML_时序图画法
- 情感分析的新方法
- 全面认识UML类图元素
- UML用户指南--UML图简介
- Windows 下 Composer 与 Laravel 4 的安装
- 重装系统
- 使用npm安装一些包失败了的看过来(npm国内镜像介绍)
- 词嵌套(词向量)简史
- 3 Sum 解答
- UML类图与面向对象设计原则
- java学习:用反射构造bean
- FMS 客户端带宽计算、带宽限制
- FLEX监视浏览器关闭事件
- 设计模式学习笔记--观察者模式
- 反向电商:硅谷创业公司正在重新发明电商
- WWDC2015 - Interface Builder技巧(IB 技巧)
- hihocoder1241 Best Route in a Grid