华东理工数据结构实验-线性结构

一、实验内容:

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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

7_lining

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值