• (华为机试)双向链表实现字符串条件表达式的求值


    描写叙述: 给定一个以字符串形式表示的算术表达式,计算该表达式的值。
    表达式支持例如以下运算:“+、-、*、/”。当中“*”和“/”的优先级要高于“+”和“-”;
    不须要考虑括号,且表达式之间没有空格。
    比如:对于表达式"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
    ",tmp);
    	DestroyList(head);
    	return tmp;
    }
    
    int main()
    {
    	char* m_str="2-3-12/2*4";
    	StrCalculate(m_str);
    	return 0;
    }


  • 相关阅读:
    让我们面向切面吧~大话开篇
    成功人士,默默做的30件事 (46)
    使用javassist框架进行动态的更改Class类
    CSS Tools: Reset CSS
    JAVA生成MD5校验码及算法实现
    如何恢复word默认设置
    java md5 3
    js Arrays
    自己写的java md
    java md5 2
  • 原文地址:https://www.cnblogs.com/yxysuanfa/p/6829299.html
Copyright © 2020-2023  润新知