数据结构基础(一)

线性表

线性表主要分为两种存储类型:顺序表示链式表示

1、线性表包含的操作
  1. 创建并返回一个空线性表
  2. 在表中某一个元素之前或之后插入一个元素
  3. 在表中删除一个值为x的元素,并返回删除成功与否的标志
  4. 在表中删除位置为p的元素,并返回删除成功与否的标志
  5. 在表中查找值为x的元素
  6. 判断表是否为空线性表
2、顺序表示

顺序表示是表示线性表的最简单的一种方法,即:将线性表中的元素储存在一片连续的存储空间中(通常使用数组)。用这种方式表示的线性表可称为顺序表

3、链接表示(链表)

链接表示的特点:
用一组可以不连续的存储单元存储线性表的各个元素,为了表示每个元素与其后继元素之间的逻辑关系,每个结点除了存储对应的元素本身的信息外,还需要存储一个指示其后继的信息(即后继元素存储位置)。如此,每个结点就包括两个域:数据域——存放元素本身的信息; 指针域:存放其后继结点的存储位置,注意,最后一个元素没有后继,它的指针域为NULL;

线性表洛谷作业题解

1、洛谷P3156 【深基15.例1】询问学号

实现代码如下:

#include <bits/stdc++.h>
using namespace std;
int n,m,t;
vector<int> ans;
int main()
{
	cin>>n>>m;
	ans.push_back(0);
	for(int i=1;i<=n;i++)
	{
		cin>>t;
		ans.push_back(t);
	}
	for(int i=0;i<m;i++)
	{
		cin>>t;
		cout<<ans[t]<<endl;
	}
    return 0;
}
2、洛谷P3613 【深基15.例2】寄包柜

实现代码如下:

#include <bits/stdc++.h>
using namespace std;

int main()
{
	vector<vector<int> > a;
	int opt,i,j,k,n,q;
	cin>>n>>q; 
	a.resize(n+1);
	for(int x=0;x<q;x++)
	{
		cin>>opt;
		if(opt==1)
		{
			cin>>i>>j>>k;
			if(a[i].size()<j+1)
			   a[i].resize(j+1);
			a[i][j]=k;
		}
		else
		{
			cin>>i>>j;
			cout<<a[i][j]<<endl;
		}
	}
    return 0;
}
3、洛谷P1449 后缀表达式

实现代码如下:

#include <bits/stdc++.h>
using namespace std;

int main()
{
	stack<int> s;
	char c;
	int left,right,tmpi,ans=0;
	cin>>c;
	while(c!='@')
	{
		left=0;
		if(c<='9'&&c>='0')
		{
			while(c<='9'&&c>='0')
			{
				tmpi=c-'0';
			    left=left*10+tmpi;
			    cin>>c;
			}	
		}
		if(c=='.')
		   s.push(left);
		else
		{
			right=s.top();
			s.pop();
			left=s.top();
			s.pop();
			if(c=='+')
			   s.push(left+right);
			if(c=='-')
			   s.push(left-right);
			if(c=='*')
			   s.push(left*right);
			if(c=='/')
			   s.push(left/right);  
		}
		cin>>c; 
	}
	cout<<s.top();
    return 0;
}
4、洛谷P1996 约瑟夫问题

实现代码如下:

#include <bits/stdc++.h>
using namespace std;

int main()
{
	queue<int> q;
	int n,m,counts=0;
	cin>>n>>m;
	for(int i=1;i<=n;i++)
	   q.push(i);
	while(counts<n)
	{
		for(int i=1;i<m;i++)
		{
			q.push(q.front());
			q.pop();
		}
		cout<<q.front()<<" ";
		q.pop();
		counts++;
	}
    return 0;
}
5、洛谷P1160 队列安排

实现代码如下:

#include <bits/stdc++.h>
using namespace std;
struct node{
    int L, R;
}a[100003];
int n, m;
inline void addRight(int x, int pos) { //插入右边 
    a[x].L = pos;
    a[a[pos].R].L = x;
    a[x].R = a[pos].R;
    a[pos].R = x;
}
inline void addLeft(int x, int pos) { //插入左边
    a[x].R = pos;
    a[a[pos].L].R = x;
    a[x].L = a[pos].L;
    a[pos].L = x;
}
inline void del(int x) {
    if(a[x].L == -1) return;
    a[a[x].L].R = a[x].R;
    a[a[x].R].L = a[x].L;
    a[x].L = -1;
    a[x].R = -1; 
}
inline void go() {
    int x = a[0].R;
    while(1) {
        cout<<x<<" ";
        if(a[x].R == -1) break;
        x = a[x].R;
    }
}
inline void init() {
    for(int i = 1; i <= n; ++i) a[i].L = a[i].R = -1;
    a[1].R = -1; a[1].L = 0; a[0].R = 1;
}
int main() {
    cin>>n;
    int cmd1, cmd2;
    init();
    for(int i = 2; i <= n; ++i) {
        cin>>cmd1>>cmd2;
        if(!cmd2) addLeft(i, cmd1);
        else addRight(i, cmd1);
    }
    cin>>m;
    for(int i = 1; i <= m; ++i) {
        cin>>cmd1;
        del(cmd1);
    }
    go();
    return 0;
}
6、洛谷P1540 [NOIP2010 提高组] 机器翻译

实现代码如下:

#include <bits/stdc++.h>

using namespace std;
int n,m,x,ans,l,r,a[1005],b[1005];
int main()
{
    cin>>m>>n;
    l=0;r=0;
    for (int i=1;i<=n;i++)
    {
        cin>>x;
        if (a[x]==0) 
        {
            ans++;
            r++;
			b[r]=x;
			a[x]=1;
            if (r>m)
			{
			    l++;
				a[b[l]]=0;
			}
        }
    }
    cout<<ans;
    return 0;
}
7、洛谷P1241 括号序列

实现代码如下:

#include <bits/stdc++.h>
using namespace std;
int top,w[110];
string a;
char s[110],c[110];
int main()
{
	cin >> a;
	int n=a.length();
	for(int i=0;i<n;i++)
	{
		if(a[i] == '(' || a[i] == '[')
		{
			s[++top]=a[i];
			w[top]=i;
			if(a[i] == '(') c[i]=')';
			else c[i]=']';
		}
		if(a[i] == ')')
		{
			if(top && s[top] == '(') {c[w[top]]=' '; top--;}
			else c[i]='(';
		} 
		if(a[i] == ']')
		{
			if(top && s[top] == '[') {c[w[top]]=' '; top--;}
			else c[i]='[';
		}
	}
	for(int i=0;i<n;i++)
	{
		if(c[i] == '(' || c[i] == '[') cout<<c[i]<<a[i];
		else if(c[i] == ')' || c[i] == ']') cout<<a[i]<<c[i];
		else cout<<a[i];
	}
	return 0;
}
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值