线性表 week3

线性表

线性表

括号序列

`

#include<iostream>
using namespace std;
int main()
{
	string s;
	cin>>s;
	char a[300]={0},c[300]={0};
	int d[300]={0};
	int top=0,n=0,f=0; 
	for(int i=0;i<s.size();i++)
	{
		//用栈储存左括号,数组储存左括号的位置
		if(s[i]=='(')
		{
			top++;
			a[top]='(';
			d[top]=i+1+f;
			n++;
			c[n]='(';
		}
		else if(s[i]=='[')
		{
			top++;
			a[top]='[';
			d[top]=i+1+f;
			n++;
			c[n]='[';
		}
		
		//读取右括号
		else if(s[i]==')')
		{
			//能够匹配
			if(a[top]=='(')
			{
				++n;
				c[n]=')';
				a[top]=0;//将左括号弹出
				top--;
			}
			//不能:补齐左括号
			else 
			{
				++n;
				c[n]='(';
				++n;
				c[n]=')';
				f++;//左括号在c中相对a的位置向后挪了一位
			}
			
		}
		else if(s[i]==']')
		{
			if(a[top]=='[')
			{
				++n;
				c[n]=']';
				a[top]=0;
				top--;
			}
			else 
			{
				++n;
				c[n]='[';
				++n;
				c[n]=']';
				f++;
			}
		}
	}
	//输出+补齐未匹配的左括号
	for(int i=1;i<=n;i++)
	{
		cout<<c[i];
		for(int j=1;j<=top;j++)//遍历未匹配的左括号
		{
			if(d[j]==i)
			{
				if(a[j]=='(')
				cout<<')';
				else if(a[j]=='[')
				cout<<']';
				break;//补齐后跳出循环
			}
		}
	}
	return 0;
}

`

后缀表达式

#include<iostream>
using namespace std;
//四则运算
int jud(int a,int b,char c)
{
	if(c=='-')
	return a-b;
	else if(c=='+')
	return a+b;
	else if(c=='*')
	return a*b;
	else
	return a/b;
}
int main()
{
	char a,b[100];
	long long c[100005]={0};
	int m=1;
	cin>>a;
	//读取数字
	while(a!= '@')
	{
		b[m]=a;
		m++;
		cin>>a;
	}
	//判断
	int flag=1,k=1; 
	for(int i=1;i<=m;i++)
	{
		//考虑到用char数组无法储存多位数 用int数组储存 相当于入栈
		//利用flag
		if(b[i]!='.'&&b[i]>='0'&&b[i]<='9')
		{
			b[i]-=48;
			c[k]=c[k]*10+b[i];
			flag=0;
		}
		else if(b[i]=='.'&&flag==0)
		{
			k++;
			flag=1;//更新flag
		}
		//计算规则:靠近两个数优先进行运算靠近他的运算
		//赋值给栈顶下一个数并且弹出栈顶
		else if(b[i]=='+'||b[i]=='-'||b[i]=='*'||b[i]=='/')
		{
			c[k-2]=jud(c[k-2],c[k-1],b[i]);//计算
			c[k-1]=0;
			k--;
		}
		
	}
	cout<<c[1];
	return 0;
}

链表

队列安排

`

#include<iostream>
using namespace std;
int k,p;
struct node{
	int l,r,d;
}a[100005]={0};
void add(int k,int i,int p)
{
	  //把i插在k的左边
      if(p==0)
		{
		   a[i].r=k;
           a[k].l=i;
		   a[i].l=a[k].l;
		   a[a[i].l].r=i;
	    }
	    //把i插在k的右边
	    else 
		{
		  a[i].r=a[k].r;
		  a[i].l=k;
		  a[k].r=i;
		  a[a[i].r].l=i;
		  
	    }
}
int main()
{
	int n;
	cin>>n;
	//设置端点
	a[0].r=0,a[0].l=0;
	add(0,1,1);
	for(int i=2;i<=n;i++)
	{
		cin>>k>>p;
		add(k,i,p);
	}
	int m,x;

	cin>>m;
	//删除元素
	while(m--)
	{
		cin>>x;
		a[x].d=1;
	}
	//输出
	for(int i=a[0].r; i ; i=a[i].r)
	{
		if(a[i].d==0)
		{
			cout<<i<<" ";
		}
	}
	
	return 0;
}

}

`

map

寄包柜

#include<bits/stdc++.h>
using namespace std;
//【柜子->【格子->物品(一对一)】(一对多)】
//map<柜子,<格子,物品> >
//便于读取
map<int,map<int,int>>a;//嵌套的map
int main()
{
	int n,q;
	cin>>n>>q;
	for(int l=1;l<=q;l++)
	{
		int b;
		cin>>b;
		if(b==1)
		{
			int i,j,k;
			cin>>i>>j>>k;
			a[i][j]=k;
		}
		else if(b==2)
		{
			int i,j;
			cin>>i>>j;
			cout<<a[i][j]<<endl;
		}
	}
	return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值