数据结构之栈与队列的面试题:判断字符串是否按照出栈顺序

可能这个题目猛一看,并不知道题目要求是什么,让我们做什么。首先我们来说说这个题目大意。
给定一个字符串,如:a b d e c
一个栈的入栈顺序为:a b c d e
那么出栈顺序显而易见:e d c b a
题目意思为:字符串 a b d e c 是否能按出栈顺序所打出。比如说,我们先入栈a元素,接着再将a元素出栈,则得到a元素,接着再入b元素,同理出栈,再入c元素,发现与字符串d元素并不一致,那么继续入栈,入d元素,发现与字符串元素一致,继续出栈,依次类推,最终得到我们的字符串abdef,不过整个过程中,我们只执行了入栈出栈操作,并没有改变其入栈出栈的顺序。这就是所要考的内容,给定任意入栈顺序,任意字符串,判断字符串是否能够根据入栈出栈操作得到即可。

这里我们的思路大致是,每次入栈后取栈顶元素与字符串比较,如果一致则出栈栈顶元素,接着比较下一个栈顶是否与字符串第二个元素一致,如果不一致,继续入栈,以此类推,直至入栈结束,或者是字符串到最后一个元素,即可判断。

//实现如下
#include <stdio.h>
#include "seqstack.h"

int str_instack(SeqStack* s, char* str1, char* str2, int len)//str1位入栈顺序,str2位字符串
{
  if(str1 == NULL || str2 == NULL) {
    return -1;
  }

  SeqStackType top;
  SeqStackInit(s);
  int i = 0;

  for(; i < len; ++i) {
    SeqStackPush(s, *str1);
    SeqStackGetFront(s, &top);//取栈顶元素比较

    while(top == *str2) {
      SeqStackPop(s);
      SeqStackGetFront(s, &top);
      str2++;
    }
    if(*str2 == '\0') {//如果str2到达'\0'证明字符串判断结束,即可以经过入栈出栈得到字符串
      return 1;
    }
    str1++;
  }
  return -1;
}

这里我们用了简单的栈的操作来帮助我们实现。

//测试代码如下
int main()
{
  SeqStack s;
  int ret;
  char str1[5] = {'a', 'b', 'c', 'd', 'e'};
  char str2[5] = {'a', 'c', 'd', 'e', 'b'};
  char str3[5] = {'a', 'd', 'b', 'e', 'c'};
  int len = sizeof(str1)/sizeof(str1[0]);

  ret = str_instack(&s, str1, str2, len);
  printf("expected ret 1,actual ret %d\n",ret);

  ret = str_instack(&s, str1, str3, len);
  printf("expected ret -1,actual ret %d\n",ret);

  return 0;
}

欢迎大家共同讨论,如有错误及时联系作者指出,并改正。谢谢大家!

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值