4441: 【例15-3】栈-手写栈函数
内存限制:128 MB
时间限制:1.000 S
评测方式:文本比较
命题人:
提交:1
解决:1
题目描述
洗盘子(1)小止是餐厅里的洗碗工,她身边有一叠餐盘要洗。客人们吃完饭之后,要洗的盘子会放在这叠餐盘的顶端;而小止洗盘子的时候,总会取出这叠餐盘最顶上的盘子来洗。
最开始桌子上没有餐盘。一位客人吃完饭了,依次把1、2、3这3个盘子放在了桌子上。现在小止取出了最顶端的3号盘子洗,洗完之后取出现在的顶端盘子2号。又有一个客人吃完了饭,依次放进了4、5这两个盘子。在这之后,小止依次洗完了5、4、1这3个盘子,结束了工作。研究这一叠盘子,把“放盘子”和“取盘子”视为事件,那么在每一次事件之后,这叠盘子会是什么状态呢?洗盘子的顺序如图15-2所示。
观察图15-2可以发现,越靠下的元素就越“顽固”,越靠上的元素就越容易改变?不难发现:对于这叠餐盘,如果a比b早加入,那a一定比b后退出。这种数据结构就是栈。栈是一种“后进先出(Last In First Out, LIFO)”的线性表,其限制是仅允许在表的一端进行插人和删除运算。
最后再看一眼“盘子状态”那一列表格,是不是觉得长得很像连绵的山,或是金字塔?请记住这个图像。这种“感性”的理解,有时候也很重要,这有助于提升联想能力。
样例输入 复制
样例输出 复制
Wash[3]
Wash[2]
Wash[5]
Wash[4]
Wash[1]
提示
#include<iostream>
#include<cstdio>
using namespace std;
#define MAXN 1010
int stack[MAXN]; //开辟栈需要的数组空间,其中MAXN是栈的最大支持的大小
int p = 0; //栈顶指针,指向下一个待插入的数组位置
void push(int x) { //压栈,需要判断栈是否溢出
if (p >= MAXN)
printf("Stack overflow.");
else {
stack[p] = x;
p += 1;
}
}
void pop() { //弹出栈顶元素,需要判断是否栈为空
if (p == 0)
printf("Stack is empty");
else
p -= 1;
}
int top() { //查询栈顶元素,需要判断是否栈为空
if (p == 0) {
printf("Stack is empty");
return -1;
} else
return stack[p - 1]; //注意按照定义方式,p-1才是栈顶
}
int main() {
push(1);push(2);push(3);
printf("Wash[%d]\n", top());pop();
printf("Wash[%d]\n", top());pop();
push(4);push(5);
printf("Wash[%d]\n", top());pop();
printf("Wash[%d]\n", top());pop();
printf("Wash[%d]\n", top());pop();
return 0;
}