(华为机试)双向链表实现字符串条件表达式的求值
2014-07-12 15:31
309 查看
描述: 给定一个以字符串形式表示的算术表达式,计算该表达式的值。
表达式支持如下运算:“+、-、*、/”,其中“*”和“/”的优先级要高于“+”和“-”;
不需要考虑括号,且表达式之间没有空格;
例如:对于表达式"3-2+15*2",该表达式值为31.
运行时间限制: 60 Sec
内存限制: 256 MByte
输入: 加减乘除四则运算表达式,长度不超过1024字节,运算式中不含有括号和空格。
输出: 表达式的运算结果。
样例输入: 3-2+15*2
样例输出: 31
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
struct ListNode{
int m_nValue;
char m_nChar;
ListNode* m_pNext;
ListNode* m_pPrev;
};
ListNode* CreatNode(int m_nValue,int m_nChar,ListNode* m_pPrev,ListNode* m_pNext)
{
ListNode* m_pNode=new ListNode();
m_pNode->m_nChar=m_nChar;
m_pNode->m_nValue=m_nValue;
m_pNode->m_pNext=m_pNext;
m_pNode->m_pPrev=m_pPrev;
return m_pNode;
}
void DestroyList(ListNode* pHead)
{
ListNode* pNode=pHead;
while(pNode!=0){
pHead=pNode->m_pNext;
free(pNode);
pNode=pHead;
}
}
int StrCalculate(char* str)
{
if(str==NULL)
return -1;
int tmp=0;
int len;
int i,k=0;
ListNode* head=NULL;
ListNode* p=NULL;
ListNode* q=NULL;
p=q=head=(ListNode*)malloc(sizeof(ListNode));
len=strlen(str);
for(i=0;i<len;i++){
tmp=0;
while(str[i]>='0'&&str[i]<='9'){
tmp=tmp*10+str[i]-'0';
++i;
}
if(k==0){
head=CreatNode(tmp,'0',NULL,NULL);
p=head;
}
else{
q=CreatNode(tmp,'0',p,NULL);
p->m_pNext=q;
p=q;
k++;
}
if(i<len){
q=CreatNode(0,str[i],p,NULL);
p->m_pNext=q;
p=q;
k++;
}
else
break;
}
p=head;
while(p->m_pNext!=NULL){
if(p->m_nChar=='*'){
tmp=p->m_pPrev->m_nValue * p->m_pNext->m_nValue;
p->m_pPrev->m_nValue=tmp;
if(p->m_pNext->m_pNext!=NULL){
p->m_pPrev->m_pNext=p->m_pNext->m_pNext;
p->m_pNext->m_pNext->m_pPrev=p->m_pPrev;
}
else{
p=p->m_pPrev;
p->m_pNext=NULL;
break;
}
}
else if(p->m_nChar=='/'){
tmp=p->m_pPrev->m_nValue/p->m_pNext->m_nValue;
p->m_pPrev->m_nValue=tmp;
if(p->m_pNext->m_pNext!=NULL){
p->m_pPrev->m_pNext=p->m_pNext->m_pNext;
p->m_pNext->m_pNext->m_pPrev=p->m_pPrev;
}
else{
p=p->m_pPrev;
p->m_pNext=NULL;
break;
}
}
p=p->m_pNext;
}
p=head;
while(p->m_pNext!=NULL){
if(p->m_nChar=='+'){
tmp=p->m_pPrev->m_nValue+p->m_pNext->m_nValue;
p->m_pNext->m_nValue=tmp;
}
else if(p->m_nChar=='-'){
tmp=p->m_pPrev->m_nValue-p->m_pNext->m_nValue;
p->m_pNext->m_nValue=tmp;
}
p=p->m_pNext;
}
tmp=p->m_nValue;
printf("the result is : %d\n",tmp);
DestroyList(head);
return tmp;
}
int main()
{
char* m_str="2-3-12/2*4";
StrCalculate(m_str);
return 0;
}
表达式支持如下运算:“+、-、*、/”,其中“*”和“/”的优先级要高于“+”和“-”;
不需要考虑括号,且表达式之间没有空格;
例如:对于表达式"3-2+15*2",该表达式值为31.
运行时间限制: 60 Sec
内存限制: 256 MByte
输入: 加减乘除四则运算表达式,长度不超过1024字节,运算式中不含有括号和空格。
输出: 表达式的运算结果。
样例输入: 3-2+15*2
样例输出: 31
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
struct ListNode{
int m_nValue;
char m_nChar;
ListNode* m_pNext;
ListNode* m_pPrev;
};
ListNode* CreatNode(int m_nValue,int m_nChar,ListNode* m_pPrev,ListNode* m_pNext)
{
ListNode* m_pNode=new ListNode();
m_pNode->m_nChar=m_nChar;
m_pNode->m_nValue=m_nValue;
m_pNode->m_pNext=m_pNext;
m_pNode->m_pPrev=m_pPrev;
return m_pNode;
}
void DestroyList(ListNode* pHead)
{
ListNode* pNode=pHead;
while(pNode!=0){
pHead=pNode->m_pNext;
free(pNode);
pNode=pHead;
}
}
int StrCalculate(char* str)
{
if(str==NULL)
return -1;
int tmp=0;
int len;
int i,k=0;
ListNode* head=NULL;
ListNode* p=NULL;
ListNode* q=NULL;
p=q=head=(ListNode*)malloc(sizeof(ListNode));
len=strlen(str);
for(i=0;i<len;i++){
tmp=0;
while(str[i]>='0'&&str[i]<='9'){
tmp=tmp*10+str[i]-'0';
++i;
}
if(k==0){
head=CreatNode(tmp,'0',NULL,NULL);
p=head;
}
else{
q=CreatNode(tmp,'0',p,NULL);
p->m_pNext=q;
p=q;
k++;
}
if(i<len){
q=CreatNode(0,str[i],p,NULL);
p->m_pNext=q;
p=q;
k++;
}
else
break;
}
p=head;
while(p->m_pNext!=NULL){
if(p->m_nChar=='*'){
tmp=p->m_pPrev->m_nValue * p->m_pNext->m_nValue;
p->m_pPrev->m_nValue=tmp;
if(p->m_pNext->m_pNext!=NULL){
p->m_pPrev->m_pNext=p->m_pNext->m_pNext;
p->m_pNext->m_pNext->m_pPrev=p->m_pPrev;
}
else{
p=p->m_pPrev;
p->m_pNext=NULL;
break;
}
}
else if(p->m_nChar=='/'){
tmp=p->m_pPrev->m_nValue/p->m_pNext->m_nValue;
p->m_pPrev->m_nValue=tmp;
if(p->m_pNext->m_pNext!=NULL){
p->m_pPrev->m_pNext=p->m_pNext->m_pNext;
p->m_pNext->m_pNext->m_pPrev=p->m_pPrev;
}
else{
p=p->m_pPrev;
p->m_pNext=NULL;
break;
}
}
p=p->m_pNext;
}
p=head;
while(p->m_pNext!=NULL){
if(p->m_nChar=='+'){
tmp=p->m_pPrev->m_nValue+p->m_pNext->m_nValue;
p->m_pNext->m_nValue=tmp;
}
else if(p->m_nChar=='-'){
tmp=p->m_pPrev->m_nValue-p->m_pNext->m_nValue;
p->m_pNext->m_nValue=tmp;
}
p=p->m_pNext;
}
tmp=p->m_nValue;
printf("the result is : %d\n",tmp);
DestroyList(head);
return tmp;
}
int main()
{
char* m_str="2-3-12/2*4";
StrCalculate(m_str);
return 0;
}
相关文章推荐
- (华为机试)双向链表实现字符串条件表达式的求值
- 字符串四则运算表达式的计算(华为机试)
- 华为招聘机试整理11:实现字符串间隔输出
- 华为招聘机试整理10:实现字符串中子字符串的替换
- 字符串四则运算表达式的计算(华为机试)
- 华为机试(字符串最后一个单词长度,计算字符串的个数,明明的随机数) Java实现
- Java - 华为机试训练 - 【中级】单词倒排(正则表达式切割字符串)
- 华为编程题之七:条件表达式求值
- JAVA实现字符串表达式求值
- 2017年,华为机试题目 《字符串按指定重新分配》 --Java实现
- 字符串表达式求值 C#实现
- 华为招聘机试整理11:实现字符串间隔输出
- 字符串四则运算表达式的计算(华为机试)
- 华为机试:四则运算(表达式求值)
- 字符串表达式校验&求值(C#实现)
- 华为招聘机试整理10:实现字符串中子字符串的替换
- C#中利用正则表达式实现字符串搜索
- C#中利用正则表达式实现字符串搜索
- C#中利用正则表达式实现字符串搜索
- 一种字符串表达式求值的简单方法