the_logic level
获赞
0
粉丝
3
关注
2
看过 TA
8
南昌大学
2029
算法工程师
IP属地:江西
logic
私信
关注
2025-12-05 16:07
南昌大学 算法工程师
# P1449 后缀表达式## 题目描述所谓后缀表达式是指这样的一个表达式:式中不再引用括号,运算符号放在两个运算对象之后,所有计算按运算符号出现的顺序,严格地由左而右新进行(不用考虑运算符的优先级)。本题中运算符仅包含 {+-*/}。保证对于 {/}运算除数不为 0。特别地,其中 {/}运算的结果需要**向 0 取整**(即与 C++ `/` 运算的规则一致)。如{3*(5-2)+7}对应的后缀表达式为:{3.5.2.-*7.+@}。在该式中,`@` 为表达式的结束符号。`.` 为操作数的结束符号。## 输入格式输入一行一个字符串 $s$,表示后缀表达式。## 输出格式输出一个整数,表示表达式的值。#1##1```3.5.2.-*7.+@```##1```16```#2##2```10.28.30./*7.-@```##2```-7```这道题比较简单可以用栈,也可以不用栈。代码如下:import sysinput=sys.stdin.readlinestr1=input()list2=[]num=''for item in str1:if ord('0')<=ord(item)<=ord('9') or item=='.':if item!='.':num=num+itemelse:list2.append(int (num))num=''elif item=="@":breakelse:if item=="+":list2.append(list2[len(list2)-1]+list2[len(list2)-2])elif item=="-":list2.append(list2[len(list2)-2]-list2[len(list2)-1])elif item=='*':list2.append(list2[len(list2)-2]*list2[len(list2)-1])elif item=='/':list2.append(list2[len(list2)-2]//list2[len(list2)-1])del list2[len(list2)-3]del list2[len(list2)-2]print(list2[0])
0 点赞 评论 收藏
分享
2025-12-05 15:55
南昌大学 算法工程师
# P5788 【模板】单调栈## 题目背景模板题,无背景。## 题目描述给出项数为 n 的整数数列 a{1...n}。定义函数 f(i)代表该a数列中第 i 个元素之后第一个大于 a_i 的元素的**下标**,即 f(i)=\min_{i<j\leq n, a_j > a_i} {j}。若不存在,则 f(i)=0。试求出 f(1...n)。## 输入格式第一行一个正整数 n。第二行 n 个正整数 a{1...n}。## 输出格式一行 n个整数表示 f(1), f(2), ..., f(n) 的值。#1##1```51 4 2 3 5```##1```2 5 4 5 0```这道题是一道模板题,跟书上的奶牛向右看一样,具体做法是从后往前遍历,栈内存储数列的序号,最开始空栈则入栈,遍历到小于栈顶则入栈,遍历到大于等于的栈顶则弹出栈顶,空栈入栈的将0存入数组,遍历到小于栈顶则栈顶是目标,存入一个数组。最后结束,顺序遍历数组。代码如下:#include<stdio.h>long long list1[3000005];long long list2[3000005];struct my_stack{long long a[3000005];int size;}st;void push(long long n,struct my_stack *p){p->a[p->size++]=n;}void pop(struct my_stack *p){p->size--;}int top(struct my_stack *p) {return p->a[p->size-1];}int empty(struct my_stack *p) {return p->size==0 ? 1 : 0 ;}int main (){int n;scanf("%d",&n);for (int i=0;i<n;i++)  {scanf("%lld",&list1[i]);list2[i]=list1[i];}for (int i=n-1;i>=0;i--){while(1){if (empty(&st)){push(i,&st);list2[i]=0;break;}else if (list1[i]<list1[top(&st)]){list2[i]=top(&st)+1;push(i,&st);break;}else { pop(&st);}}}for (int i=0;i<n-1;i++)  printf("%lld ",list2[i]);printf("%lld",list2[n-1]);return 0;}
0 点赞 评论 收藏
分享

创作者周榜

更多
关注他的用户也关注了:
牛客网
牛客网在线编程
牛客网题解
牛客企业服务