Bootstrap

PTA数据结构——实验2(栈和队列)

一、编程题

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("回文");
    }
}

;