C语言实践第五次习题集(队列和栈)

微信号

题目

小明刚认识了新同学小红,他想要小红的微信号,小红不想直接告诉他,所以给了小明一串加密了的数字,并且把解密规则告诉了小明。
解密规则是:首先删除第1个数,接着把第2个数放在这串数的最后面,再删除第3个数,并把第4个数放在这串数的最后面……直至只剩最后一个数,把最后一个数也删除。
按照删除的顺序,把这些数字连在一起就是小红的微信号。请你按照解密规则帮小明得到小红的微信号。

输入格式:

第一行包括一个正整数n(1 < n < 500),表示这串微信号的长度;
第二行包括n个数字,即加密的小红的微信号。

输出格式:

输出解密后的微信号,相邻数字之间有空格。

输入样例:

9
1 2 3 4 5 6 7 8 9

输出样例:

1 3 5 7 9 4 8 6 2

思路

本题不难,只要利用队列进行相应的操作,如把元素压入队列,把元素从队列中弹出,检查队首元素,等等等等。c++中关于直接使用队列(queue)的学习【头文件#include】

完整代码

#include<iostream>
#include<queue>//要想创建队列需要包含这个头文件 
using namespace std;
struct inf{//创建结构体 
	int data;
}num[505],temp;
int main()
{
	int n,i,j,store[505];
	queue <inf> Q;//创建一个名为Q的队列,<>中是队列元素的类型名 
	cin>>n;
	for(i=1;i<=n;i++){
		cin>>num[i].data;
		Q.push(num[i]);//将元素逐一压入队列 
	}
	i=1;
	j=0;
	while(!Q.empty()){
		if(i%2!=0){
			temp=Q.front();//复制队首元素 
			store[j++]=temp.data;
			Q.pop();//弹出队首元素 
		}
		else{
			temp=Q.front();
			Q.pop();
			Q.push(temp);//将元素压入队列 
		}
		i++;
	}
	for(i=0;i<j;i++){
		cout<<store[i]<<' ';
	}
	return 0;
}

谁比我大

题目

给定一个含有n个整数的数列a1,a2,...an。定义函数 f(ai)表示数列中第i个元素ai之后第一个大于ai的元素的下标,若这样的元素不存在,则f(ai)=0。

输入格式:

第一行包含一个正整数n(n<=1e6);
第二行包含n个正整数 a1,a2,...an(1<=ai<=1e9)。

输出格式:

输出仅一行包含 n个整数,分别代表 f(ai) 的值。

输入样例:

5
1 4 2 3 5

输出样例:

2 5 4 5 0

思路

这题思路很简单,直接暴力搜寻即可。

完整代码

#include<iostream>
using namespace std;
void f(int m);
struct inf{
	int size,num,a;//size为自身的大小,num自身的号码 
}line[1000005];
int n;
int main()
{
	int i;
	cin>>n;
	for(i=1;i<=n;i++){
		cin>>line[i].size;
		line[i].num=i;
		line[i].a=-1;//做一个预处理标记 
	}
	for(i=1;i<=n;i++){
		f(i);
	}
	for(i=1;i<=n;i++) cout<<line[i].a<<' ';
	return 0;
}
void f(int m)
{
	int i;
	for(i=m+1;i<=n;i++){
		if(line[m].size<line[i].size){
			line[m].a=line[i].num;
			break;
		}
	}
	if(line[m].a==-1) line[m].a=0;
}

后缀表达式

题目

所谓后缀表达式是指这样的一个表达式:式中不再引用括号,运算符号放在两个运算对象之后,所有计算按运算符号出现的顺序,严格地由左而右进行(不用考虑运算符的优先级)。
如:中缀表达式 3(5–2)+7 对应的后缀表达式为:352-7+ 。
请将给出的中缀表达式转化为后缀表达式并输出。

输入格式:

输入仅一行为中缀表达式,式中所有数字均为个位数,表达式长度小于1000。

输出格式:

输出一行,为后缀表达式,式中无空格。

输入样例:

2+48+(88+1)/3

输出样例:

248+881+3/+

思路

利用栈,可以很好地完成中缀表达式到后缀表达式的转化。中缀表达式转后缀表达式(逆波兰表达式)冯强 将算术表达式转化为后缀表达式 栈的用法

完整代码

#include<stdio.h>
char a[1005],b[1005]={0};//用b数组来模拟栈 
int main()
{
	int i,top=-1; 
	scanf("%s",a);
	for(i=0;a[i]!='\0';i++){
		if('0'<=a[i]&&a[i]<='9') printf("%c",a[i]);//数字直接输出 
		else{
			if(-1==top||'('==a[i]||'('==b[top]){//若为空栈、当前a[i]为左括号或此时栈顶为左括号,直接存入 
				b[++top]=a[i]; 
			}
			else if(')'==a[i]){//当遇到右括号 
				while('('!=b[top]){//去找与其配对的左括号 
					printf("%c",b[top--]);
				}
				top--;//注意 
			}
			else{ 
				if('*'==a[i]||'/'==a[i]){//乘除 
					if('+'==b[top]||'-'==b[top]) b[++top]=a[i];//栈顶元素优先级比当前检索到的符号低 
					else{
						//将优先级大于等于a[i]的元素输出,知道到达栈底或到达左括号前,再把a[i]压入栈中 
						do{
					       printf("%c",b[top--]);
					       //优先级大于等于自己的输出,否则弹出 
				        }while(top!=-1&&'('!=b[top]&&'+'!=b[top]&&'-'!=b[top]);
				        b[++top]=a[i];//把a[i]压入栈中
					}
				}
				else{//加减
				    // 将优先级大于等于a[i]的元素输出,知道到达栈底或到达左括号前,再把a[i]压入栈中 
					while(top!=-1&&b[top]!='('){
						printf("%c",b[top--]);
					}
					b[++top]=a[i];
				}
			}
		}
	}
	while(top!=-1){//将栈中剩余的元素全部取出 
		printf("%c",b[top--]);
	}
	return 0;
} 

后缀表达式计算

题目

Kunkun学长觉得应该让学弟学妹了解一下这个知识点:后缀表达式相对于中缀表达式更容易让计算机理解和学习。现在kunkun学长给出一串后缀表达式,你能帮他算出这个后缀表达式的值吗?

输入格式:

第一行输入后缀表达式长度n(1<=n<=25000);
第二行输入一个字符串表示后缀表达式(每个数据或者符号之间用逗号隔开,保证输入的后缀表达式合法,每个数包括中间结果保证不超过long long长整型范围)

输出格式:

输出一个整数,即后缀表达式的值。

输入样例1:

6
10,2,+

输出样例1:

12

输入样例2:

14
2,10,2,+,6,/,-

输出样例2:

0

思路

后缀表达式的求值规则为:从左到右扫描后缀表达式,如果遇到操作数,将其压入栈中,如果遇到操作符,则从栈中弹出两个操作数,计算结果,然后把结果入栈,直到遍历完后缀表达式,则计算完成,此时的栈顶元素即为计算结果。栈的应用--后缀表达式的运算

完整代码

#include<iostream>
using namespace std;
int judge(char b);
void cal(long long int res,long long int n,char b);
char line[25005];
long long int a[25005],top=-1;
int main()
{
	long long int i,n,f=0,index;
	cin>>n;
	for(i=0;i<n;i++) cin>>line[i];
	line[i]='\0';
	for(i=0;i<n;i++){
		if(-1==top){
			a[++top]=line[i]-'0';//为空栈,直接压入
			index=top;//标记正在处理的数的位置和栈顶的位置 
		} 
		else{
			if(','!=line[i]){//非逗号 
				if(judge(line[i])){//判断是否为数字 
					if(i+1==n||line[i+1]==','){//判断是否为数字前的符号 
						cal(a[top-1],a[top],line[i]);
						a[top--]=0;
						index--;
						i++;
					}
					else f=1;
				}
				else a[index]=a[index]*10+line[i]-'0';
			}
			else{
				if(f==1) a[index]*=-1;
				f=0; 
				top=index;
				index++;
				a[index]=0;
			}
		}
	}
	cout<<a[0];
	return 0;
}
int judge(char b)
{
	if('0'<=b&&b<='9') return 0;
	else return 1;
}
void cal(long long int res,long long int m,char b)
{
	if('+'==b) a[top-1]=res+m;
	else if('-'==b) a[top-1]=res-m;
	else if('*'==b) a[top-1]=res*m;
	else a[top-1]=res/m;
}

猜你喜欢

转载自www.cnblogs.com/031902522ycy/p/12577622.html