二、算法与程序设计题(本题共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));
- }
- }