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

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


原文地址:https://www.cnblogs.com/yxysuanfa/p/6829299.html