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

描述: 给定一个以字符串形式表示的算术表达式,计算该表达式的值。

表达式支持如下运算:“+、-、*、/”,其中“*”和“/”的优先级要高于“+”和“-”;

不需要考虑括号,且表达式之间没有空格;

例如:对于表达式"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;
}

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

时间: 2024-12-17 20:24:05

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

华为机试—回文字符串

给出一个长度不超过1000的字符串,判断它是不是回文(顺读,逆读均相同)的. #include <iostream> #include <cstring> using namespace std; int huiwen(char *a){ int len = strlen(a); int i,j=len-1; for(i=0;i<len/2;i++,j--){ if(a[i]!=a[j]){ return 0; } } return 1; } int main(){ char

华为机试—指针合并字符串

写一个程序实现功能:将两个字符串合并为一个字符串并且输出,用指针实现. #include <stdio.h> int main() { char str1[20]={"Hello "}, str2[20]={"World"}; char *p=str1, *q=str2; while( *p ) p++; while( *q ) { *p = *q; p++; q++; } *p = '\0'; printf("%s\n", str1

华为机试:删除字符串中出现次数最少的字符

题目描述 实现删除字符串中出现次数最少的字符,若多个字符出现次数一样,则都删除.输出删除这些单词后的字符串,字符串中其它字符保持原来的顺序. 输入描述: 字符串只包含小写英文字母, 不考虑非法输入,输入的字符串长度小于等于20个字节. 输出描述: 删除字符串中出现次数最少的字符后的字符串. 示例1 输入 abcdd 输出 dd Java:用两个数组来记录各个字符的个数,一个用来排序找出最小的字符出现次数,一个用来决定是否输出当前字符. 1 import java.util.Arrays; 2 i

【华为机试练习】字符串最后一个单词的长度

题目描述计算字符串最后一个单词的长度,单词以空格隔开.输入描述:一行字符串,非空,长度小于5000.输出描述:整数N,最后一个单词的长度. 解法(C语言版): #include<stdio.h> #include<string.h> int main() { char str[5000]; int i, n, len; gets(str); len = strlen(str); n = 0; if(len != 0) for(i = len-1; (str[i] != ' ') &

【华为机试练习】字符串分隔

题目描述?连续输入字符串,请按长度为8拆分每个字符串后输出到新的字符串数组:?长度不是8整数倍的字符串请在后面补数字0,空字符串不处理.输入描述:连续输入字符串(输入2次,每个字符串长度小于100)输出描述:输出到长度为8的新字符串数组 解法(C语言版): #include<stdio.h> #include<string.h> char *outputstr(char *in, char *out) { int i; for(i = 0; i < 8; ++i) { if(

【华为机试练习】字符串反转

题目描述写出一个程序,接受一个字符串,然后输出该字符串反转后的字符串.例如:输入描述:输入N个字符输出描述:输出该字符串反转后的字符串 解法1(C语言版): #include<stdio.h> int main() { char str[1000]; int len, i, j; char temp; gets(str); len = strlen(str); for(i = 0, j = len - 1; i < j; ++i, --j) { temp = str[i]; str[i]

2014年6月6日--华为机试

准备了还有一段时间了,结果还是悲剧了,主要准备的是算法,结果华为机试更看重字符串的操作,这一块正好是自己的弱项,哎.不过还有时间,这几个月多刷刷题,多锻炼锻炼,加油吧. 机试一共考了三道题,两道简单点的,一道难题,难题考得是状态机,不知道是什么东西╮(╯▽╰)╭,简单的两题做的也不好,回来在重新做一下.   1.倒置英文句子中单词的字母顺序. hello, I am good.  ->  olleh, I ma doog. 这题其实不难,当时脑子有点纠结符号,所以没做出来,还有一点客观原因,平时

华为机试在线训练(4)

华为机试在线训练:字符串分隔 题目描述 ?连续输入字符串,请按长度为8拆分每个字符串后输出到新的字符串数组:?长度不是8整数倍的字符串请在后面补数字0,空字符串不处理. 输入描述: 连续输入字符串(输入2次,每个字符串长度小于100) 输出描述: 输出到长度为8的新字符串数组 输入例子: abc123456789 输出例子: abc000001234567890000000 代码: 1 import java.util.Arrays; 2 import java.util.Scanner; 3

华为机试正式版(西安c/c++/java),今天下午去机试的题目,新鲜出炉了!

以下题目都是回忆的,题目都很简单, 大家有些基础就可以参加!(语言可以是c/c++,也可以是java的) 题目一(60分): 字符串操作, 将小写转换成大写, 将大写转化为小写, 数字的不做转换 例如, 输入:aBcD12 输出:AbCd12 题目二(100分): 将输入的字符串按照规定重新排序,如果字符串长度为奇数, 则中间的字符保持不变, 中间字符左侧降序排列, 右侧字符按照升序排列, 如果字符串长度为偶数,则左半侧字符降序排列,右半侧字符则按照升序排列 例如, 输入:ab5de 输出:ba