[栈]专项

栈中有几个通用的函数,但他们都不是程序自带的,需要手动写出

1.void pop(){top--;return;}

2.void push(int x){top++;z[top]=x;return;}

3. int front(){return z[top];}

4.bool empty(return top==0;)

注:top为栈的深度(后面讲)z[]是栈(后面讲)

---------------------------------------------------------------------------------------------------------------------------------

先来讲栈的概念

开枪是这样的

上膛是这样的

开枪=弹出一颗子弹,这种操作在栈里表示元素弹出

上膛=压入一颗子弹,这种操作在栈里表示元素压入

---------------------------------------------------------------------------------------------------------------------------------

接下来讲每个函数的用途

push(x)代表上膛[元素压入]

pop()代表开枪[元素弹出]

而为什么说是元素而不是数据,字符捏

因为栈有各种类型[char z][long long z][string z]....

empty()返回栈(弹匣)里是否有元素[子弹]

front()返回第一个元素

---------------------------------------------------------------------------------------------------------------------------------

因此栈就是这个

右边的字母表示等待进栈的元素,中间的长方形就代表栈

但是,这里的东西第一个放入的却不会第一个出来[出了某些特殊情况]

换成英文就是(F)ist (I)n (L)ast (O)ut 简写为FILO

---------------------------------------------------------------------------------------------------------------------------------

接下来,就可以开始程序了,在洛谷里有一道题【模板】栈

接下来就是开敲时间了

首先程序框架不能忘

忘得看

#include<bits/stdc++.h>

using namesapce std;

int main(){

        return 0;

}

接下来,这个题目用"query"代替了"front"(栈有多个版本)并且多了一个未提到的部分"size",

而"top“(栈的深度/高度)就已经可以代替函数返回栈中元素个数,所以直接cout<<top<<endl;即可

这里,还有几个比较特殊的部分

1,pop()要检测栈中是否为空,需要使用empty判断

if(empty()){//如果栈是空的(bool返回0)

        cout<<"Empty"<<endl;//empty没有感叹号

}

2,front()要检测栈是否为空,方法如上!

3,在输入字符串时,如果使用char x[100]的方式不可取,需要使用string x字符串

if(x=="xxx"){

        xxx//做什么

4,本人亲测,这题仅使用cin,cout不可取,会出现TLE超时,至少要把两个改成scanf/printf

5,此题如果不使用unsigned long long 也会出错(所有int改成他),意思是去掉符号(负号)因为题

里说明0≤x<2*2(64)

---------------------------------------------------------------------------------------------------------------------------------

接下来就可以开敲,具体问题私信我改正,附AC程序一份

#include<bits/stdc++.h>
using namespace std;
unsigned long long top=0,i=0,j=0;
string z[114514];
string a;
char b[100001];
void pop(){
    top--;
    return;
}
void push(string x){
    top++;
    z[top]=x;
    return;
}
string front(){
    return z[top];
}
bool empty(){
    if (top==0) return true;
    else return false;
}
int main(){
    cin>>i;
    while(i--){
        cin>>j;
        while(j--){
            cin>>a;
            if(a=="push"){
                scanf("%s",b);
                push(b);
            }
            else if(a=="pop"){
                if(top<=0) printf("Empty\n");
                else pop();
            }
            else if(a=="query"){
                if(top==0) printf("Anguei!\n");
                else cout<<front()<<endl;
            }
            else if(a=="size")
                cout<<top<<endl;
        }
        top=0;
    }
    return 0;

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值