#问题求解与方程# 实验三 F 数据结构之栈的应用

数据结构之栈的应用

发布时间: 2018年4月2日 20:47   时间限制: 1000ms   内存限制: 128M

描述

对于每一位学计算机的孩纸来说,数据结构(Data Structure)无疑是一门很重要的课程,对于做ACM的fudq来说,学好数据结构那可是重中之重啊~

某天,fudq坐火车去旅行,途径火车站,看到火车进站出站,突然回想起当年Professor Li教授的数据结构里栈的应用,还有那充满激情的“抽签助手”……

什么是“栈”呢,很多人马上会想到后进先出(Last In First Out)吧~

根据百度百科解释:

栈是只能在某一端插入和删除的特殊线性表。它按照后进先出的原则存储数据,先进入的数据被压入栈底,最后的数据在栈顶,需要读数据的时候从栈顶开始弹出数据(最后一个进栈的数据被第一个读出来)

于是fudq想到了Professor Li曾经为了加深同学们对栈的理解,所提出的一个问题:

给出两个字符串s1和s2,请判断s1能否通过栈的模拟(即进栈和出栈)得到s2?

是不是很easy,那就快快AC吧~

输入

输入有多组测试数据,每组输入占两行,s1和s2各占一行。为了简化问题,s1和s2保证仅由小写字母组成,不会出现其它字符;s1和s2等长,且长度不大于100;s2是s1的一种排列,不会在s2中出现s1里没有的字符。

输出

对于每组输入,输出仅占一行,如果s1能通过栈的模拟得到s2,则输出“YES”;否则输出“NO”。

样例输入1
abcde
baedc
bjfuacm
fujcbma
样例输出1
YES
NO

———————————————————————————————————————————————————

感觉上这个题就是十分经典的火车入栈问题~

但是为啥就是A不了呢.....................Runtime error

#include<iostream>
#include<cstdio>
#include<stack>
using namespace std;
int main()
{
	int n,i,j;
	stack<char>s;
	char str1[120],str2[120],flag=1;
	while(scanf("%d",&n)!=EOF)
	{	
		while(!s.empty())
		s.pop();
		
		cin>>str1>>str2;
		for(i=0,j=0;i<n;i++)
		{
			s.push(str1[i]);
			while(!s.empty()&&s.top()==str2[j])
			{
				s.pop();
				j++;
			}
		}
		if(!s.empty())
		{
			cout<<"NO"<<endl;
			flag=0; 
		}
		else
		{
			cout<<"YES"<<endl;
		}
	} 
	return 0;
}

标程:

#include<cstdio>
#include<cstring>
#include<stack>
#include<iostream>
using namespace std;
int main()
{
    //freopen("data.in","r",stdin);
    string s1,s2;
    stack<char>s;
    while(cin>>s1>>s2)
    {
        while(!s.empty())
            s.pop();
        int i=0,j=0;
        while(j<s2.length())
        {
            if(s1[i]==s2[j])
            {
                i++;
                j++;
            }
            else if(!s.empty()&&s.top()==s2[j])
            {
                s.pop();
                j++;
            }
            else if(i<s1.length())
            {
                s.push(s1[i]);
                i++;
            }
            else
                break;
        }
        j==s2.length()?cout<<"YES"<<endl:cout<<"NO"<<endl;
    }
    return 0;
}
方法有记忆价值 有些思考点还有卡壳 但是..我要记下来...
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值