一、编程题
7-1 算术表达式求解
完成简单的数学表达式的求值问题。假设表达式仅含“加、减、乘、除”四种运算,所有运算对象均为整数。运算结果也是整数,若出现除法,则必然能整除。
输入格式:
输入一个算术运算式,以“#”结尾,其中运算数都是整型。
输出格式:
输出运算结果,运算结果也是一个整数。
输入样例:
34+75/5-4*2#
输出样例:
41
代码:
#include<iostream>
#include<cstdio>
#include<string>
#include<stack>
using namespace std ;
int youxianji(char x)
{
if(x =='*' || x == '/') return 2;
if(x == '+'|| x == '-') return 1;
if(x == '#')return 3;
return 0;
}
int jisuan(int a, int b, char x)
{
switch(x) {
case '+': return a + b;
case '-': return a - b;
case '*': return a * b;
case '/': return a / b;
}
return 0;
}
int main()
{
stack<int> values;
stack<char> ops;
string s;
getline(cin, s);
for(int i = 0; i < s.length(); i++)
{
int num = 0;
while(isdigit(s[i]))
{
num = num * 10 + int(s[i] - '0');
i++;
}
values.push(num);
if(s[i] == '*' || s[i] == '/' || s[i] == '-' || s[i] == '+' )
{
while(!ops.empty() && youxianji(ops.top()) > youxianji(s[i]))
{
int val2 = values.top();
values.pop();
int val1 = values.top();
values.pop();
values.push(jisuan(val1, val2, ops.top()));
ops.pop();
}
ops.push(s[i]);
}
while (s[i] == '#'&& !ops.empty())
{
int val2 = values.top(); values.pop();
int val1 = values.top(); values.pop();
char op = ops.top(); ops.pop();
values.push(jisuan(val1, val2, op));
}
}
cout<< values.top();
}
7-2 中缀表达式转后缀表达式问题
假定运算符集合为{ +、-、*、/、(、)},利用栈将输入的中缀表达式转换成等价的后缀表达式,并输出。
输入格式:
输入一个字符串表示的中缀表达式(以“#”结束),其中每个操作数用一个小写字母表示。
输出格式:
将对应的后缀表达式输出。
输入样例:
a+b-a*((c+d)/e-f)+g#
输出样例:
ab+acd+e/f-*-g+
代码:
#include <iostream>
#include <stack>
#include <string>
#include <cctype>
using namespace std;
// 运算符优先级比较
int precedence(char op) {
if (op == '+' || op == '-') return 1;
if (op == '*' || op == '/') return 2;
return 0;
}
// 判断是否为运算符
bool isOperator(char c) {
return c == '+' || c == '-' || c == '*' || c == '/';
}
// 中缀转后缀
string infixToPostfix(const string& infix) {
stack<char> s;
string postfix;
for (char c : infix) {
if (c == '(') {
// 遇到左括号,直接压入栈
s.push(c);
} else if (c == ')') {
// 遇到右括号,弹出栈内运算符并加到后缀表达式,直到遇到左括号
while (!s.empty() && s.top() != '(') {
postfix += s.top();
s.pop();
}
if (!s.empty() && s.top() == '(') {
s.pop(); // 弹出左括号
}
} else if (isOperator(c)) {
// 遇到运算符,根据优先级弹出栈内运算符
while (!s.empty() && precedence(s.top()) >= precedence(c)) {
postfix += s.top();
s.pop();
}
s.push(c); // 将当前运算符压入栈
} else if (isalpha(c)) {
// 遇到操作数(这里是小写字母),直接加到后缀表达式
postfix += c;
}
// 忽略其他字符,如空格和'#'
}
// 弹出栈中剩余的所有运算符
while (!s.empty()) {
postfix += s.top();
s.pop();
}
return postfix;
}
int main() {
string infix;
getline(cin, infix); // 读取整行输入
// 移除'#'
size_t pos = infix.find('#');
if (pos != string::npos) {
infix = infix.substr(0, pos);
}
string postfix = infixToPostfix(infix);
cout << postfix << endl;
return 0;
}
7-3 打印杨辉三角形
按指定格式输出杨辉三角的前N行。
输入格式:
输入一个小于30的正整数N。
输出格式:
输出杨辉三角的前N行,输出时,每个数字之后加一个空格。
输入样例:
5
输出样例:
1
1 1
1 2 1
1 3 3 1
1 4 6 4 1
代码:
#include<cstdio>
#include<cmath>
int main()
{
int N;
scanf("%d", &N);
int a[1000][1000] = {0};
a[1][1] = 1;
for( int i =2 ; i <= N; i++)
{
for(int j = 1 ; j <= N; j++)
{
a[i][j] = a[i-1][j-1] + a[i-1][j];
}
}
for( int i =1 ; i <= N; i++)
{
for(int j = 1 ; j <= i; j++)
{
printf("%d ",a[i][j]);
}
printf("\n");
}
}
7-4 回文判断
回文指正反读均相同的字符序列,例如“abba”和”abdba”均是回文,但“good”不是回文,判定给定字符串是否是回文。
输入格式:
输入一个字符串
输出格式:
如果是回文,输出“回文”;否则输出“不是回文”
输入样例1:
aabcba
输出样例1:
不是回文
输入样例2:
abba
输出样例2:
回文
代码:
#include<cstdio>
#include<string>
#include<iostream>
#include<algorithm>
using namespace std;
int main()
{
string str1;
string str2;
cin>>str1;
str2 = str1;
reverse(str1.begin(),str1.end());
// cout<<str1<<' '<<str2<<endl;
if(!equal(str1.begin(),str1.end(),str2.begin()))
{
printf("不是回文");
}
else
{
printf("回文");
}
}