实现一个可以支持入栈,出站并输出栈顶和查询站内最小的值三个操作的栈

首先前2个操作,普通的栈都是ok的。

对于后一个操作,我们可以考虑2种做法:

1.在建立这个栈的同时我们维护一个二叉堆。每次操作是O(logn)的

2.再搞一个栈专门维护每个时刻的最小值。每次操作是O(1)的

代码写了第二种。

#include <bits/stdc++.h>

using namespace std;
/*
用优先队列:查找是O(logn)的
再开一个栈:O(1) 保存历史记录 
*/ 
int n;
stack<int> s;
stack<int> b;
int minv=0x3f3f3f3f;
int main()
{
	scanf("%d",&n);
	for(int i=1;i<=n;i++)
	{
		int k,x;
		scanf("%d",&k);
		if(k==1)
		{
			scanf("%d",&x);
			s.push(x);
			minv=min(minv,x);
			b.push(minv);
		}
		else if(k==2)//pop 
		{
			s.pop();
			b.pop();
		}
		else//getmin
		{
			printf("%d\n",b.top());
		}
	}
	return 0;
 } 
/*
7
1 5
1 4
1 3
2
3
1 2
3
*/

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是一份C++代码示例: ```C++ #include <iostream> #include <string.h> using namespace std; const int MAXSIZE = 100; // 的最大容量 struct Student { char name[20]; int id; int score; }; struct Stack { Student data[MAXSIZE]; // 中存储的元素 int top = -1; // 栈顶指针,初始为-1 }; void init(Stack& s) { s.top = -1; } bool isEmpty(Stack s) { return s.top == -1; } bool isFull(Stack s) { return s.top == MAXSIZE - 1; } void push(Stack& s, Student x) { if (isFull(s)) { cout << "Error: Stack is full!" << endl; return; } s.top++; s.data[s.top] = x; } Student pop(Stack& s) { if (isEmpty(s)) { cout << "Error: Stack is empty!" << endl; Student nullStudent; nullStudent.id = -1; return nullStudent; } Student x = s.data[s.top]; s.top--; return x; } Student getTop(Stack s) { if (isEmpty(s)) { cout << "Error: Stack is empty!" << endl; Student nullStudent; nullStudent.id = -1; return nullStudent; } return s.data[s.top]; } void print(Stack s) { if (isEmpty(s)) { cout << "Error: Stack is empty!" << endl; return; } for (int i = s.top; i >= 0; i--) { cout << "Name: " << s.data[i].name << ", ID: " << s.data[i].id << ", Score: " << s.data[i].score << endl; } } int main() { Stack s; init(s); Student s1 = {"Alice", 1001, 90}; Student s2 = {"Bob", 1002, 85}; Student s3 = {"Charlie", 1003, 95}; push(s, s1); push(s, s2); push(s, s3); print(s); Student topStudent = getTop(s); cout << "Top student: " << topStudent.name << ", ID: " << topStudent.id << ", Score: " << topStudent.score << endl; Student poppedStudent = pop(s); cout << "Popped student: " << poppedStudent.name << ", ID: " << poppedStudent.id << ", Score: " << poppedStudent.score << endl; print(s); return 0; } ``` 该程序定义了一个结构体`Student`,包括姓名、学号、成绩三个字段。另外,还定义了一个结构体`Stack`,其中包括一个数组`data`以及栈顶指针`top`。函数`init`用于初始化,函数`isEmpty`和`isFull`用于判断是否为空或已满,函数`push`用于将元素入栈,函数`pop`用于将栈顶元素出并返回,函数`getTop`用于返回栈顶元素,函数`print`用于遍历输出其中的元素。在`main`函数中,我们创建了三个学生对象,并将它们依次入栈。然后输出整个,取出栈顶元素并输出,将栈顶元素出输出,最后再次输出整个

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值