2.28、算法练习
一、自由练习
1)资源限制
时间限制:1.0s 内存限制:512.0MB
2)问题描述
从键盘输入一个不超过8位的正的十六进制数字符串,将它转换为正的十进制数后输出。
注:十六进制数中的10~15分别用大写的英文字母A、B、C、D、E、F表示。
3)样例输入
FFFF
4)样例输出
65535
#include<iostream>
#include<cstring>
using namespace std;
int main()
{
long long x;
cin>>hex>>x;
cout<<dec<<x<<endl;
return 0;
}
二、视频练习
1)视频链接
https://www.bilibili.com/video/BV1jE411g76D?p=11
2)栈的知识点
栈,是一种满足一定约束的线性数据结构。其约束是:只允许在栈的一端插入或删除元素,这一端被称为栈顶;相对地,我们把另一端称为栈底。我们通常用一个top来指示栈顶的位置。
进栈:①若TOP≥n时,则给出溢出信息,作出错处理(进栈前首先检查栈是否已满,满则溢出;不满则作②);
②置TOP=TOP+1(栈指针加1,指向进栈地址);
③S(TOP)=X,结束(X为新进栈的元素);
退栈:①若TOP≤0,则给出下溢信息,作出错处理(退栈前先检查是否已为空栈, 空则下溢;不空则作②);
②X=S(TOP),(退栈后的元素赋给X);
③TOP=TOP-1,结束(栈指针减1,指向栈顶)。
(1)建栈:只要把栈顶指针置为零。即在程序开始时,置top=0;
(2)测试栈:测试栈顶指针的值,若top=0,则栈空;若top=n,则栈满。
(3)读栈:若top=0,则栈空,无栈顶元素可读,显示出错信息,中止程序;
若top<>0,则回送栈顶元素的值STACK[top]给某个变量。
(4)进栈(push):将栈顶指针加1后,再把新元素送到栈顶。注意进栈操作前必须保证栈不能满,否则会溢出
3)题目描述
小鱼最近被要求参加一个数字游戏,要求它把看到的一串数字 a_i(长度不一定,以 0 结束),记住了然后反着念出来(表示结束的数字 0 就不要念出来了)。这对小鱼的那点记忆力来说实在是太难了,你也不想想小鱼的整个脑袋才多大,其中一部分还是好吃的肉!所以请你帮小鱼编程解决这个问题。
4)输入格式
一行内输入一串整数,以 00 结束,以空格间隔。
5)输出格式
一行内倒着输出这一串整数,以空格间隔。
6)输入输出样例
输入 #1
3 65 23 5 34 1 30 0
输出 #1
30 1 34 5 23 65 3
7)数据规模与约定
对于 100%100% 的数据,保证 0 <=a<= 2^31-1,数字个数不超过 100。
#include<iostream>
#include<stack>
using namespace std;
stack<int> a;
int c;
int main(){
while(1){
cin>>c;
if(c==0) break;
a.push(c);
}
while(!a.empty()){
cout<<a.top()<<" ";
a.pop();
}
return 0;
}
2.1)题目描述
假设一个表达式有英文字母(小写)、运算符(+,—,*,/)和左右小(圆)括号构成,以“@”作为表达式的结束符。请编写一个程序检查表达式中的左右圆括号是否匹配,若匹配,则返回“YES”;否则返回“NO”。表达式长度小于255,左圆括号少于20个。
2.2)输入格式
一行:表达式
2.3)输出格式
一行:“YES” 或“NO”
2.4)输入输出样例
输入 #1
2*(x+y)/(1-x)@
输出 #1
YES
输入 #2
(25+x)(a(a+b+b)@
输出 #2
NO
2.5)说明/提示
表达式长度小于255,左圆括号少于20个
#include <iostream>
#include <cstring>
#include <cmath>
#include <cstdio>
using namespace std;
char a;
int s=0;
int main()
{
for (int i=0;;i++)
{
a=getchar();
if (i==0&&a==')')
{
cout<<"NO"<<endl;
return 0;
}
if (a=='(') s++;
if (a==')') s--;
if (s<0)
{
cout<<"NO";
return 0;
}
if (a=='@')
{
if (!s)
cout<<"YES";
else
cout<<"NO";
return 0;
}
}
}