一、实验内容:
1.已知一元多项式P,设计算法计算P的导数。多项式以指数递减的方式输入,每行代表一项,每行的第一个分量表示非零系数,第二个分量代表指数。输出格式同输入格式相同。
输入样例:
3 4
-5 2
6 1
-2 0
输出样例:
12 3
-10 1
6 0
2.给定两个链表,每个链表都已经按升序排列,设计算法实现将两个链表合并到一个升序链表中,返回合并后的链表。
输入:
1 4 5
1 3 6
输出:1 1 3 4 5 6
3.输入一个中缀表达式,利用栈结构求解表达式的值。其中运算符包括:+、-、*、/、(、),表达式以“=”为结尾,参与运算的数据为double类型且为正数。
输入样例:20 * ( 4.5 – 3 ) =
输出结果:30.00
4.给定一个队列,利用队列的合法操作(isEmpty、AddQ、DeleteQ)实现队列中元素的从小到大排序。其中:输入第一行表示队列元素个数,第二行为队列中的元素。
注意:不允许直接访问队列中的元素。
输入样例:
10
9 4 6 1 8 3 7 0 2 5
输出样例:
0 1 2 3 4 5 6 7 8 9
二.实现代码
1.使用了数组的数据结构,分别用两个数组来存放每个多项式的系数和多项式的次数。再用循环来一组组地处理输出。
#include<bits/stdc++.h>
using namespace std;
vector<int>a;
int main()
{
int n;
printf("请输入多项式含有几项:");
cin>>n;
for(int i=1;i<=n;i++)
{
int tmp1,tmp2;
scanf("%d %d",&tmp1,&tmp2);
a.push_back(tmp1);
a.push_back(tmp2);
}
cout<<"结果为"<<endl;
for(int i=0;i<2*n;i+=2)
{
if(a[i+1])
cout<<a[i]*a[i+1]<<" "<<a[i+1]-1<<endl;
}
return 0;
}
2.使用了链表的数据结构(stl大法好),先将链表中的数据储存进来,再用sort()函数来对其进行排序
#include<bits/stdc++.h>
using namespace std;
list<int>a;
list<int>::iterator it;
int main()
{
printf("请隔行按升序的方式输入每组链表的数据,输入完成后按ctrl+z中断:");
cout<<endl;
int tmp;
while(cin>>tmp)
{
a.push_back(tmp);
}
a.sort();
for(it=a.begin();it!=a.end();it++)
{
cout<<*it;
}
return 0;
}
3.使用栈的数据结构。设计思路为先定义两个栈,一个栈存放操作数,另一个栈存放操作符号。通过一个for来遍历表达式。如果扫描到的是数字,就直接入数字栈,如果扫描到的是一个符号,分如下情况:
1、如果当前的符号栈为空,就直接入栈
2、如果符号栈中有操作符,就进行比较,如果当前的操作符的优先级小于或者等于栈中的操作符,就需要从数栈中pop中取出两个数,再从符号栈中pop中取出一个数,进行运算,将得到的结果入数栈,然后将当前的操作符入符号栈
3、如果当前的操作符的优先级大于栈中的操作符,就直接入符号栈。当表达式扫描完毕后,就顺序的从数栈和符号栈中pop出相应的数字和符号,并进行运算。最后在数栈中只有一个数字,就是表达式的计算结果。
这里还有难点就是输入样例不是只有个位数,还有两位数,那么我们就要想办法转化
#include <bits/stdc++.h>
using namespace std;
int getPripority(char ch){//计算运算符的优先级
int level=0;
switch(ch){
case '(':
level=1;
break;
case '+':
case '-':
level=2;
break;
case '*':
case '/':
level=3;
break;
default:
break;
}
return level;
}
bool isNum(char ch){
if(ch>='0'&&ch<='9')return true;
return false;
}
double cal(double a,double b,char ch){
double result;
switch(ch){
case '+':
result = a+b;
break;
case '-':
result = a-b;
break;
case '*':
result = a*b;
break;
case '/':
result = a/b;
break;
}
return result;
}
int main(){
string exp;
cin>>exp;
stack<char> op;
stack<double> number;
int len = exp.size();
for(int i=0;i<len-1;i++)
{
if(exp[i]==' ')continue;
if(isNum(exp[i]))
{//如果是数字
double num = 0;
do {
num = num * 10 + (exp[i] - '0')*1.0;
i++; // 下一个字符
}while(i<len&&isNum(exp[i]));
if(exp[i]=='.')
{
int j=-1;
i++;
while(i<len&&isNum(exp[i]))
{
num=num+(exp[i] - '0')*1.0*pow(10,j);
j--;
i++;
}
}
i--;
number.push(num);
}
else
{
int score = getPripority(exp[i]);
if(op.empty()||exp[i]=='('||score>getPripority(op.top()))
{
op.push(exp[i]);
}
else
{
while(!op.empty()&&score<=getPripority(op.top())){
if(op.top()=='('){//如果栈顶为左括号,那么停止并弹出有括号,表示括号内运算完毕
op.pop();
break;
}
char ch = op.top();
op.pop();
double b = number.top();
number.pop();
double a = number.top();
number.pop();
double result = cal(a,b,ch);//计算
number.push(result);
}
if(exp[i]!=')')op.push(exp[i]); //加入当前运算符
}
}
}
while(!op.empty())//处理完整个字符串之后把栈所有符号都输出
{
char ch = op.top();
op.pop();
double b = number.top();
number.pop();
double a = number.top();
number.pop();
double result = cal(a,b,ch);//计算
number.push(result);
}
printf("%.2lf",number.top());
return 0;
}
4.第四题使用队列。设计思路为使用stl中的优先队列,来实现进队列自动进行排序。
#include<bits/stdc++.h>
using namespace std;
int n;
priority_queue<int,vector<int>,greater<int> > pq;
int main()
{
cin>>n;
int tmp;
for(int i=1;i<=n;i++)
{
cin>>tmp;
pq.push(tmp);
}
for(int i=1;i<=n;i++)
{
cout<<pq.top()<<" ";
pq.pop();
}
return 0;
}