9月6日算法学习(栈)

1.模版栈
描述
请你实现一个栈。

操作:
push x:将 加x x 入栈,保证 x x 为 int 型整数。
pop:输出栈顶,并让栈顶出栈
top:输出栈顶,栈顶不出栈
输入描述:
第一行为一个正整数 n n ,代表操作次数。(1≤n≤100000)(1≤n≤100000)
接下来的 n n ,每行为一个字符串,代表一个操作。保证操作是题目描述中三种中的一种。

输出描述:
如果操作为push,则不输出任何东西。
如果为另外两种,若栈为空,则输出 "error“
否则按对应操作输出。

这题是自己手敲一个栈出来,采用的是acm模式,我使用函数将相关的几个操作封装了起来,然后使用strcmp来分辨应该进行什么操作。因为是使用的c语言,所以分配空间的时候使用的是malloc。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define max 100000
typedef struct{
    int t[max];
    int top;
}stack;

void initstack(stack *s){
    s->top=-1;
}

void push(stack *s,int m){
    if(s->top==max) printf("error\n");
    else{
        s->t[s->top]=m;
        s->top++;
    }
}

void pop(stack *s){
    if(s->top==-1) printf("error\n");
    else{
        s->top--;
        printf("%d\n",s->t[s->top]);
    }
}

void top(stack *s){
    if(s->top==-1) printf("error\n");
    else{
        s->top--;
        printf("%d\n",s->t[s->top]);
        s->top++;
    }
}

int main(){
    int n;
    scanf("%d",&n);
    stack *s = (stack*)malloc(sizeof(stack));
    initstack(s);
    while(n--){
        char *r = (char*)malloc(6*sizeof(char));
        scanf("%s",r);
        if(!strcmp(r,"pop")) pop(s);
        if(!strcmp(r,"top")) top(s);
        if(!strcmp(r,"push")){
            int b;
            scanf("%d",&b);
            push(s,b);
        }
    }
}

2.栈的压入、弹出序列
描述
输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否可能为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如序列1,2,3,4,5是某栈的压入顺序,序列4,5,3,2,1是该压栈序列对应的一个弹出序列,但4,3,5,1,2就不可能是该压栈序列的弹出序列。

  1. 0<=pushV.length == popV.length <=1000
  2. -1000<=pushV[i]<=1000
  3. pushV 的所有数字均不相同

这题依旧采用c语言进行实现,因为是核心代码模式,所以在结题时只用考虑返回值为真还是为假。我采用的是看最后栈有没有空,如果没有空则代表该序列无法实现。

/**
 * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
 *
 * 
 * @param pushV int整型一维数组 
 * @param pushVLen int pushV数组长度
 * @param popV int整型一维数组 
 * @param popVLen int popV数组长度
 * @return bool布尔型
 */
bool IsPopOrder(int* pushV, int pushVLen, int* popV, int popVLen ) {
    // write code here
    int temp[pushVLen],top=0;
    int m=0,n=0;
    while(m<pushVLen){
        temp[top++]=pushV[m++];
        while(top>0&&n<popVLen&&temp[top-1]==popV[n]){
            n++;
            top--;
        }
    }
    return top==0;
}

3.有效括号序列
描述
给出一个仅包含字符’(‘,’)‘,’{‘,’}‘,’[‘和’]',的字符串,判断给出的字符串是否是合法的括号序列
括号必须以正确的顺序关闭,"()“和”()[]{}“都是合法的括号序列,但”(]“和”([)]"不合法。

数据范围:字符串长度 0≤n≤100000≤n≤10000
要求:空间复杂度 O(n)O(n),时间复杂度 O(n)O(n)

这题依旧是核心代码的模式,鉴于此,所以此题使用c++语言进行编写,使用了c++里关于栈的库函数。

class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param s string字符串 
     * @return bool布尔型
     */
    bool isValid(string s) {
        // write code here
        stack<char> a;
        for(int i=0;i<s.length();i++)
        {
            if(a.empty())
            {
                a.push(s[i]);
                continue;
            }
            if(s[i]==')'&&a.top()=='(') a.pop();
            else if(s[i]==']'&&a.top()=='[') a.pop();
            else if(s[i]=='}'&&a.top()=='{') a.pop();
            else a.push(s[i]);
        }
        return a.empty();
    }
};

谢谢你的阅读!

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值