在栈中压入一个字符串c语言,C语言实践第五次习题集(队列和栈)

2023-05-16

微信号

题目

小明刚认识了新同学小红,他想要小红的微信号,小红不想直接告诉他,所以给了小明一串加密了的数字,并且把解密规则告诉了小明。

解密规则是:首先删除第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

#include//要想创建队列需要包含这个头文件

using namespace std;

struct inf{//创建结构体

int data;

}num[505],temp;

int main()

{

int n,i,j,store[505];

queue 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

cout<

}

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

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<

return 0;

}

void f(int m)

{

int i;

for(i=m+1;i<=n;i++){

if(line[m].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

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

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>line[i];

line[i]=‘\0‘;

for(i=0;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<

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;

}

原文:https://www.cnblogs.com/031902522ycy/p/12577622.html

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在栈中压入一个字符串c语言,C语言实践第五次习题集(队列和栈) 的相关文章

随机推荐