week3

1. 定义数组 const int maxn=
2.定义可变数组vector <char> v; // vector默认长度是0, 类型可以是c++的标准类型,也可以是自己定义的类或结构体
vector <int> v(N); // 效果类似int v[N];但是N可以是变量
vector <int> v(N, i); // 可变数组最开始有N个元素,每个元素的值是i,i可以省略不写
vector < vector<int> > v; // > > 分开写,有的编译器不分开会当成右移符合>>
3.相关函数 1.int len = v.size();该函数会返回一个size_t类型的值,表示vector内元素的个数(数组的长度) 2. v.resize();如果原本内存里不够5个元素,那么调用v[4]就会出现段错误
    eg:  v.resize(5);给vector重新分配内存,之后v内有5个元素,调用v[4]就不会有问题了
如果原本vector里元素个数已经多于5个了,那么调用resize(5)以后,vector会删除之后多于的元素 3.push_back() 4.遍历for (int i = 0; i < v.size(); ++i) { cout << v[i] << endl;}
 4.栈      是只允许在一端进行插入或删除的 线性表。首先栈是一种 线性表,但限定这种线性表只能在某一端进行插入和删除操作。 栈顶线性表允许进行插入删除的那一端。 栈底固定的,不允许进行插入和删除的另一端。 空栈不含任何元素的空表。
建立栈 int sta[1005]; // 用来存储栈内数据的数组
int top; // 栈顶元素的下标
向栈内添加,减少    ++top;sta[top] = x;   sta[top] = 0; --top;
5.链表  表中的每个节点在存储本身的相关信息的时候,还可存储一个前驱或者后继

例题一P3613 【深基15.例2】寄包柜

#include<bits/stdc++.h>
using namespace std;
const int maxn=1e5+5;//定义数组; 
struct guizishu
{
     
    int fangru=0; 
    vector <int> gezi;
    vector <int>wupin;//格子数未知 定义可变数组; 
};
guizishu a[maxn];
int main()
{
	int n,q;
	cin>>n>>q;
	int flag,b,c,d;
	for(int i=1;i<=q;i++)
	{
		scanf("%d",&flag);
		if(flag==1)
		{
		    scanf("%d%d%d",&b,&c,&d);
            a[b].fangru++;//最多查询次数 
            a[b].gezi.push_back(c);//将数字c添加到gezi[0]之后; 
            a[b].wupin.push_back(d);//将数字d添加到wupin[0]之后; 
      		}
		else
	    {
		scanf("%d%d",&b,&c);
		for(int i=a[b].fangru;i>=0;i--)
		{
			if(a[b].gezi[i]==c)
        {
        
        	printf("%d\n",a[b].wupin[i]);
        	break;
		}
		}
        
		}	
		
	}
	return 0;

例题二P1241 括号序列

#include<bits/stdc++.h> 
using namespace std;
const int maxn=105;//定义数组 
int a[maxn];
int main()
{   
string s;
cin>>s;
for(int i=0;i<s.length();i++)//题目上咋说就怎么判断 
{
	if(s[i]==')')
	{
		for(int j=i-1;j>=0;j--)
		{
			if(a[j]==0&&(s[j]=='('||s[j]=='['))
			{
				if(s[j]=='(')
				{
					a[j]=1;
					a[i]=1;
				}
				break;
			}
		}
	}
     if(s[i]==']')
	{
		for(int j=i-1;j>=0;j--)
		{
			if(a[j]==0&&(s[j]=='('||s[j]=='['))
			{if(s[j]=='[')
				{
				a[j]=1;
				a[i]=1;
				}
            break;
			}
		}
	}
}
for(int i=0;i<s.length();i++)
{
	if(a[i]==0&&s[i]=='(')
	{
		cout<<"()";
	}
if(a[i]==0&&s[i]==')')
	{
		cout<<"()";
	}
if(a[i]==0&&s[i]=='[')
	{
		cout<<"[]";
	}
if(a[i]==0&&s[i]==']')
	{
		cout<<"[]";
	}
if(a[i]==1)cout<<s[i];
}
return 0;
}

例题三P1449 后缀表达式

#include<bits/stdc++.h>
using namespace std;
int top;//栈顶元素的下标
int a[55];//栈 
int main()
{   
    
	string s;
	cin>>s;
	int k=-1;//用k来定位最新的数字操作符'.' ,便于存数字 ; 
	int med;
	for(int i=0;i<s.length();i++)
	{
		if(s[i]=='.')
		{
			
			int x=0;
			int y=1;
			top++;
			if(s[k+1]=='-')//考虑负数
			{
				for(int j=i-1;j>=k+2;j--)
				{
				  x=x+(s[j]-'0')*y;
			      y=y*10;
				}
				x=(-1)*x;
			}
		    else 
		    for(int j=i-1;j>=k+1;j--)
			{
			     x=x+(s[j]-'0')*y;
			     y=y*10;
			}
			a[top]=x;
			k=i;
		
		}
	if(s[i]=='+')
		{
			med=a[top]+a[top-1];
			top=top-1;//遇到运算符栈顶元素减一 
			a[top]=med;
			k=i;
		}
	if(s[i]=='-')
		{
			med=a[top-1]-a[top];
			top=top-1;
			a[top]=med;
			k=i;
		}
		 if(s[i]=='*')
		{
			med=a[top-1]*a[top];
			top=top-1;
			a[top]=med;
			k=i;
		}
	if(s[i]=='/')
		{
			med=a[top-1]/a[top];

			top=top-1;
			a[top]=med;
			k=i;
		}
	if(s[i]=='@')
		break;
	}
    cout<<med;
	return 0;
}

例题四P1160 队列安排

#include<bits/stdc++.h> 
using namespace std;
const int maxn=1e5+5;
int n,m;
struct T{
    int l,r;        
    int flag;         
}t[maxn];//定义结构体 为了便于删除 所以使用flag 
void add(int i,int k,int p)       
{
    if(p==1)       //将k插入到i的右边
    {
        t[k].r=t[i].r;//k右边的换为i的右边 
        t[k].l=i; //k 左边的是i 
        t[i].r=k;//i右边是k 
        t[t[k].r].l=k; //k右边的左边是i; 
    }
    else         
    {
        t[k].r=i;
        t[k].l=t[i].l;
        t[i].l=k;
        t[t[k].l].r=k;
    }
}
int main()
{
    int x,k,p;
    cin>>n;
    t[0].r=0;
	t[0].l=0;
    add(0,1,1); 
    for (int i=2;i<=n;i++)
    {
        cin>>x>>p;
        add(x,i,p);
    }
    cin>>m;
   for(int i=0;i<m;i++)
       { cin>>x;
        t[x].flag=1;    
		}     
   
    for (int i=t[0].r;i;i=t[i].r)//当i!=0时一直运行 
    {
        if (t[i].flag==0)    
          cout<<i<<" ";
    }
    return 0;
}

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值