数据结构作业记录

文章目录

          • 1.1两数求和
          • 2.1字符串插入(10分)
          • 2.2大整数乘法(10分)
          • 2.3约瑟夫问题(10分)
          • 3.1中缀表达式求值(8分)
          • 3.2HTML(8分)
          • 3.3密码翻译(10分)
          • 4.1合格的字符串(10分)

1.1两数求和


2.1字符串插入(10分)

题目内容: 有两个字符串str和substr,str和substr的字符个数不超过10^5,只包含大小写字母和数字。(字符个数不包括字符串结尾处的’\0’。)将substr插入到str中ASCII码最大的那个字符后面,若有多个最大则只考虑第一个。
输入格式:
输入数据只有一行,格式为
str substr
输出格式:
输出插入之后的字符串。
输入样例:

abcab eee

输出样例:

abceeeab

答案

#include
using namespace std;
int main()
{
	string a,b;
	cin>>a>>b;
	int key=0;
	for(int i=1;i<a.length();i++)
	{
		if(a[i]>a[key])
			key=i;
	}
	for(int j=0;j<=key;j++)
	{
		cout<<a[j];
	}
	cout<<b;
	for(int j=key+1;j<a.length();j++)
	{
		cout<<a[j];
	}
	return 0;
 } 
2.2大整数乘法(10分)

题目内容: 求两个不超过200位的非负整数的积。
输入格式: 有两行,每行是一个不超过200位的非负整数,没有多余的前导0。
输出格式: 一行,即相乘后的结果。结果里不能有多余的前导0,即如果结果是342,那么就不能输出为0342。
输入样例:

12345678900
98765432100

输出样例:

1219326311126352690000

答案:

#include
#include
#include
#include
using namespace std;
int main()
{
   string a,b;
   cin>>a>>b;
   int n=a.length()+b.length();
   int *s=new int[n];
   for(int i=0;i<n;i++)
   {
   	s[i]=0;
   }
   cout<<endl;
   for(int i=0;i<a.length();i++)
   {
   	for(int j=0;j<b.length();j++)
   	{
   		s[i+j+1]+=(a[i]-'0')*(b[j]-'0');
   	} 
   }
   for(int i=a.length()+b.length()-1;i>0;i--)
   {
   	if(s[i]>9)
   	{
   		s[i-1]+=s[i]/10;
   		s[i]%=10;
   	}
   }
   int c=0;
   for(int i=0;i<n;i++)
   {
   	if(s[i]==0)
   		c++;
   	else 	
   		break;
   }
   for(int i=c;i<n;i++)
   {
   	cout<<s[i];
   }
   if (c==n)
   {
   	cout<<0;
   }
   return 0;
}
2.3约瑟夫问题(10分)

题目内容: 有n只猴子,按顺时针方向围成一圈选大王(编号从1到n),从第1号开始报数,一直数到m,数到m的猴子退出圈外,剩下的猴子再接着从1开始报数。就这样,直到圈内只剩下一只猴子时,这个猴子就是猴王,编程求输入n,m后,输出最后猴王的编号。
输入格式: 输入包含两个整数,第一个是n,第二个是m (0 < m,n <=300)。
**输出格式:**输出包含一行,即最后猴王的编号。
输入样例:

18 2

输出样例:

5

答案: 前一个是带头结点的,后一个是不带头结点的。

#include
using namespace std;
struct Node
{
	int data;
	Node *next;
};
void SetList(Node *head,int n)
{
	Node *tail=head;
	for (int i=0;i<n;i++)
	{
		Node *s=new Node;
		s->data=i+1;
		tail->next=s;
		tail=s;
	}
	tail->next=head;
}
void DelNode(Node *head,int m)
{
	Node *flag=head;
	while (head->next->next!=head)
	{
		for (int i=0;i<m-1;i++)
		{
			if(flag->next!=head)
				flag=flag->next;
			else
				flag=head->next;
		}
		Node *d=flag->next;
		if(d==head)
		{
			d=d->next;
			flag=flag->next;
		}
		flag->next=d->next;
		delete d;
	}
}
int main()
{
	int n,m;
	cin>>n>>m;
	Node *head=new Node;
	head->next=head;
	SetList(head,n);
	DelNode(head,m);
	cout<<head->next->data;
	return 0;
}
#include
#include 
using namespace std;
struct node 
{
	int data;
	node * next;
};
int  main ( )
{ 
	node *p=new node;
	node *head=p;
	int n,m;
	cin>>n>>m;
	for (int i=1;i<n;i++)
	{
		p->data=i;
		p->next=new node;
		p=p->next;
	}
	p->data=n;
	p->next=head;
	p=head;
	while(p->next!=p)
	{
		for (int i=0;i<m-2;i++)
		{
			p=p->next;
		}
		
		node *q=p->next;
		p->next=q->next;
		delete q;
		p=p->next;
	}
	cout<<p->data<<endl;
	return 0;
}

3.1中缀表达式求值(8分)

题目内容:
通过把“中缀转后缀”和“后缀求值”两个算法功能集成在一起(非简单的顺序调用),实现对中缀表达式直接求值,新算法还是从左到右扫描中缀表达式,但同时使用两个栈,一个暂存操作符,一个暂存操作数,来进行求值。
(支持 + - * / ^ 五种运算)
输入格式:
共1行,为1个字符串,即一个中缀表达式,其中每个数字或符号间由一个空格隔开。
输出格式:
共1行,为一个整数,即求值的结果。
输入样例:

( 2 + 3 ) * 6 + 4 / 2

输出样例:

32

附Python模板:


class Stack:
    def __init__(self):
        self.items = []
    def isEmpty(self):
        return self.items == []
    def push(self, item):
        self.items.append(item)
    def pop(self):
        return self.items.pop()
    def peek(self):
        return self.items[len(self.items)-1]
    def size(self):
        return len(self.items)

def calculate(s):
    # 请在此编写你的代码(可删除pass语句)
    pass
    # 代码结束
print(calculate(input()))

答案:
Python这个不是我写的,我抄了人家的答案:原网址→我是答案

def domath(op,op1,op2):
    if op=='*':
        return op1*op2
    elif op=='/':
        return op1/op2
    elif op=='+':
        return op1+op2
    elif op=='-':
        return op1-op2
    else:
        return op1**op2
class Stack:
    def __init__(self):
        self.items = []
 
    def isEmpty(self):
        return self.items == []
 
    def push(self, item):
        self.items.append(item)
 
    def pop(self):
        return self.items.pop()
 
    def peek(self):
        return self.items[len(self.items)-1]
 
    def size(self):
        return len(self.items)
 
def calculate(s):
    # 请在此编写你的代码(可删除pass语句)
    opStack=Stack()
    numStack=Stack()
    prec={}
    prec['^']=4
    prec['*']=3
    prec['/']=3
    prec['+']=2
    prec['-']=2
    prec['(']=1
    s=s.split()
    for token in s:            
        if token.isdigit():
            numStack.push(int(token))
        elif token=='(':
            opStack.push(token)
        elif token==')':
            toptoken=opStack.pop()
            while toptoken!='(':
                operand2=numStack.pop()
                operand1=numStack.pop()
                result=domath(toptoken,operand1,operand2)
                numStack.push(result)
                toptoken=opStack.pop()
        else:
            while(not opStack.isEmpty())and (prec[opStack.peek()]>=prec[token]):
                op=opStack.pop()
                operand2=numStack.pop()
                operand1=numStack.pop()
                result=domath(op,operand1,operand2)
                numStack.push(result)
            opStack.push(token)
    while not opStack.isEmpty():
        op=opStack.pop()
        operand2=numStack.pop()
        operand1=numStack.pop()
        result=domath(op,operand1,operand2)
        numStack.push(result)
    return numStack.pop()

print(int(calculate(input())))
3.2HTML(8分)

题目内容:
实现扩展括号匹配算法,用来检查HTML文档的标记是否匹配。HTML标记应该成对、嵌套出现,开标记是这种形式,闭标记是这种形式。
输入格式:
共1行,为一个字符串,即一个HTML文档中的内容。
输出格式:
共1行,为True或者False,表示该字符串中的标记是否匹配。
输入样例:

Example

Hello, world

输出样例:

True

附Python模板:

class Stack:
    def __init__(self):
        self.items = []
    def isEmpty(self):
        return self.items == []
    def push(self, item):
        self.items.append(item)
    def pop(self):
        return self.items.pop()
    def peek(self):
        return self.items[len(self.items)-1]
    def size(self):
        return len(self.items)

def HTMLMatch(s):
    # 请在此编写你的代码(可删除pass语句)
    pass
    # 代码结束
print(HTMLMatch(input()))

答案:

#include 
#include 
#include 
using namespace std;
int main()
{
	stack <string> html;
	string input;
	getline(cin, input);//读入字符输入的字符串
	for (int  i = 0; i < input.length(); i++)	
	{
		/* 处理读入的数据,把输入的整个字符串分割成小的"" */
		if (input[i] != '<') //分割,以"<"为界限
			continue;
		
		bool flag = false;	//检验小字符串是否是的标志
		string mid = ""; //临时存储分割出来的小字符串
		while (input[i] != '>')
		{
			if (input[i] == '/') //如果是,进行标记,但是不存储/(方便最后和栈顶元素比较)
			{
				flag = true;
				i++;
			}
			else
				mid += input[i++]; //进行存储小字符串
		}
		//mid += '>';
		//↑这一句写不写都行,如果不写入栈的就是
		if(!flag) //如果是压入栈
			html.push(mid);
		else 
		{
			if (mid == html.top())//如果是并且和栈顶相同,弹出栈顶元素
				html.pop();
			else
				html.push(mid);//如果是并且和栈顶不同,压入栈
		}
	}
	if (html.empty())
		cout << "True";
	else
		cout << "False";
	return 0;
}

3.3密码翻译(10分)

题目内容: 在情报传递过程中,为了防止情报被截获,往往需要对情报用一定的方式加
密,简单的加密算法虽然不足以完全避免情报被破译,但仍然能防止情报被轻易的识别。我们给出一种最简的的加密方法,对给定的一个字符串,把其中从a-y,A-Y的字母用其后继字母替代,把z和Z用a和A替代,则可得到一个简单的加密字符串。
输入格式:
第一行是字符串的数目n。
其余n行每行一个字符串。
输出格式:
输出每行字符串的加密字符串。
输入样例:

1
Hello! How are you!

输出样例:

Ifmmp! Ipx bsf zpv!

答案:

#include
using namespace std;
int main()
{
	int n;
	cin>>n;
	getchar();
	string a;
	while(n!=0)
	{
		getline(cin,a);
		for(int i=0;i<a.length();i++)
		{
			if(a[i]>='a'&&a[i]<='z')
				a[i]='a'+(a[i]-'a'+1)%26;
			else if(a[i]>='A'&&a[i]<='Z')
				a[i]='A'+(a[i]-'A'+1)%26;
		}
		cout<<a<<endl;
		n--;
	}
	return 0;
 } 


4.1合格的字符串(10分)

题目内容:、老师给小学生门布置了一些作业,让它们按照一个模版写一些字符串交上来,同学们把作业交上来了,问题来了,这么多的作业老师批改不过来,现在请你帮老师写一个程序,帮助老师确定各个字符串是否合格。
首先老师有一个匹配模版,比如是“aa[123]bb”这一个字符串,同学们交的各种作业字符串如aa1bb、aa2bb、aa3bb都算是正确匹配看,而aacbb就是错误的字符串。(即待查字符串对应于模版方括号内的部分,应该为方括号内字符串的一个子字符)。我们需要做的就是按照模版,找出正确的字符串和所在的行。
输入格式:
输入的第一行为一个整数n,表示有多少个学生的作业,即有多少行需要检查的字符串。(1<=n<=50)
中间为n行字符串,代表着n个学生们写的作业。每个字符串长度小于50。
最后一行为1行字符串,代表着老师给的匹配模板。
输出格式:
输出合格的字符串的行号和该字符串。(中间以空格隔开)
输入样例:

4
Aab
a2B
ab
ABB
a[a2b]b

输出样例:

1 Aab
2 a2B
4 ABB

解析:
这个题模板左右两边的都要匹配,模板中间的也要匹配。
比如对于模板a[a2b]babc不合法abB合法。
答案:

#include 
#include 
using namespace std;
int main()
{
	int n;
	cin >> n; 
	string *word = new string[n], A;
	for (int i = 0; i < n; i++)
	{
		cin >> word[i];
	}
	cin >> A;//模板
	int left = A.find('['), right = A.find(']');
	string B = A.substr(left + 1, right - left - 1);//模板内容
	for (int  i = 0; i < n; i++) //从第一个字符串开始
	{
		if (word[i].length() != A.length() - B.length() - 1)
			continue;
		bool flag = true,f=false;
		for (int j = 0; j < left; j++) //左
		{
			if (word[i][j] != A[j] && word[i][j] != char(A[j] + 32) && word[i][j] != char(A[j] - 32))
			{
				flag = false;
				break;
			}
		}
		if (flag==false) continue;
		for (int j = right+1; j < A.length(); j++)//右
		{
			if (word[i][j-(right-left)] != A[j] && word[i][j - (right - left)] != char(A[j] + 32) && word[i][j - (right - left)] != char(A[j] - 32))
			{
				flag = false;
				break;
			}
		}
		if (flag==false) continue;
		for (int j =0; j < B.length();j++)//中
		{
			if (word[i][left] == B[j]|| word[i][left] == char(B[j] + 32)|| char(B[j] - 32))
			{
				f = true;
				break;
			}
		}
		if(f==true)
			cout << i+1 << " " << word[i] << endl;
	}
	return 0;
}

你可能感兴趣的:(刷题)