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;
}