二、算法与程序设计题(本题共45分)
1. 使用C/C++编写函数,实现字符串反转,要求不使用任何系统函数,且时间复杂度最小,函数原型:char* reverse_str(char* str)。(15分)
算法实现:
/*实现字符串翻转*/ char* reverse_str(char* str) { if(NULL == str) //字符串为空直接返回 { return str; } char *begin; char *end; begin = end = str; while(*end != '\0') //end指向字符串的末尾 { end++; } --end; char temp; while(begin < end) //交换两个字符 { temp = *begin; *begin = *end; *end = temp; begin++; end--; } return str; //返回结果 } void main() { char str[] = "123456"; printf(reverse_str(str)); }
2. 给定一个如下格式的字符串,(1,(2,3),(4,(5,6),7))括号内的元素可以是数字,也可以是另一个括号,请实现一个算法消除嵌套的括号,比如把上面的表达式变成:(1,2,3,4,5,6,7),如果表达式有误请报错。(15分)
分析:此题实际上考的是站的应用,即曾经练过的括号匹配问题。
算法实现:
#include <stdio.h> #include <STACK> using namespace std; /*判断表达式是否合法*/ bool IsValid(char *str) { if(NULL == str) return false; stack<char> op; while(*str) { if(*str == '(') { op.push(*str++); } else if(*str == ')') { if(op.empty()) return false; else op.pop(); str++; } else { str++; } } if(op.empty()) return true; else return false; } /*消除中间的括号*/ char *Elimination_brackets(char *str) { if(str == NULL) //字符串为空返回 return str; char* temp = new char[strlen(str)+1]; char* result = temp; *temp++ = *str++; //跳过第一个左括号 while(*str!='\0') { if(*str == ')' || *str=='(') //有括号,跳过赋值 { str++; continue; } *temp++ = *str++; } *temp++ = ')'; //将有括号加上 *temp = '\0'; return result; } void main() { char str[] = "(1,(1,0),3)"; int a = 0; if(IsValid(str)) { printf(Elimination_brackets(str)); } }