线性表
线性表主要分为两种存储类型:顺序表示 和 链式表示。
1、线性表包含的操作
- 创建并返回一个空线性表
- 在表中某一个元素之前或之后插入一个元素
- 在表中删除一个值为x的元素,并返回删除成功与否的标志
- 在表中删除位置为p的元素,并返回删除成功与否的标志
- 在表中查找值为x的元素
- 判断表是否为空线性表
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;
}