zoukankan      html  css  js  c++  java
  • hdu 1022 (栈)STL容器的应用

    进入和输出的数组为order1,和order2,。当栈为空或者栈顶元素!=order2[i],则入栈,且队列进“in”。否则,即栈不为空且栈顶元素与order[i]相等,则出栈,队列进“out”。

    不断进行上面2个判断,直至两个数组遍历完,或者在中途中达不到目标顺序,使程序停止。

    结果为“NO”的结束条件是,当栈为空或者栈顶元素!=order2[i]时,数组order1已经遍历了即j==n时,表示出栈顺序不一致。

    代码1:使用容器stack和queue

     1 #include<iostream>
     2 #include<stdio.h>
     3 #include<string>
     4 #include<string.h>
     5 #include<algorithm>
     6 #include<math.h>
     7 #include<vector>
     8 #include<stack>
     9 #include<queue>
    10 using namespace std;
    11 int n;
    12 int i,j;
    13 char order1[12],order2[12];
    14 void cal()
    15 {
    16     stack<int>st;
    17     queue<string>q;
    18     for(i=0,j=0;i<n&&j<=n;)// j可以为n,作为判断结束的条件
    19     {
    20         if(st.empty()||st.top()!=order2[i])
    21         {
    22             if(j==n)
    23             {
    24                 cout<<"No."<<endl<<"FINISH"<<endl;
    25                 return ;
    26             }
    27             st.push(order1[j++]);
    28             q.push("in");
    29         }
    30         else
    31         {
    32             st.pop();
    33             q.push("out");
    34             i++;
    35         }
    36     }
    37     cout<<"Yes."<<endl;
    38     string ch;
    39     while(!q.empty())
    40     {
    41         ch=q.front();  //q.front返回的是对头元素的引用,是地址
    42         cout<<ch<<endl;//输出的是字符串ch,ch为字符串数组的首地址
    43         q.pop();
    44 
    45     }
    46     cout<<"FINISH"<<endl;
    47 }
    48 
    49 int main()
    50 {
    51     while(cin>>n)
    52     {
    53         cin>>order1>>order2;
    54         cal();
    55 
    56     }
    57 
    58     return 0 ;
    59 }

    代码二:使用容器vector

     区别在于输出“in”和“out”是用标记输出的,而没有用队列方便

     1 #include<iostream>
     2 #include<stdio.h>
     3 #include<string>
     4 #include<string.h>
     5 #include<algorithm>
     6 #include<math.h>
     7 #include<vector>
     8 #include<stack>
     9 #include<queue>
    10 #define N 12
    11 #define IN 0
    12 #define OUT 1
    13 using namespace std;
    14 
    15 char o1[N],o2[N];
    16 int seq[N*2];
    17 int n;
    18 int idx;
    19 bool cal()
    20 {
    21     vector<char> V;
    22     int i,j;
    23     for(i=0,j=0;i<n&&j<=n;)
    24     {
    25         if(V.empty()||V.back()!=o2[i])
    26         {
    27             if(j==n)
    28             {
    29                 return 0;
    30             }
    31             V.push_back(o1[j++]);
    32             seq[idx++]=IN;
    33 
    34         }
    35         else
    36 
    37         {
    38             V.pop_back();
    39             seq[idx++]=OUT;
    40             i++;
    41         }
    42     }
    43     return 1;
    44 
    45 }
    46 
    47 int main()
    48 {
    49 
    50     while(cin>>n)
    51     {
    52         idx=0;
    53         cin>>o1>>o2;
    54         if(cal())
    55         {
    56             cout<<"Yes."<<endl;
    57             for(int i=0;i<n*2;i++)
    58             {
    59                 if(seq[i])
    60                     cout<<"out"<<endl;
    61                 else
    62                     cout<<"in"<<endl;
    63             }
    64 
    65         }
    66         else
    67         {
    68             cout<<"No."<<endl;
    69         }
    70         cout<<"FINISH"<<endl;
    71     }
    72     return 0 ;
    73 }

    一:

    vector类常用函数如下:

    1,构造函数 vector();

    2,增加函数 push_back(x),向量尾部增加一个元素x。

    3,删除函数 pop_back(),删除向量最后一个元素。clear(),删除所有元素。

    4,遍历函数

    reference back(),返回尾元素的引用。

    reference front(),返回首元素的引用。

    5,判断函数 bool empty(),向量是否为空。

    6,大小函数 size()

    7,其他 函数 swap(),交换两个同类型向量的数据。

    二:

    队列和堆栈

    1,构造函数,queue(),stack();

    2,队列和堆栈共有函数

    bool empty(),

    int size();

    push(x); 将x压入队尾(栈顶);

    pop(),当队列(栈)非空,删除队头(栈顶)元素。

    3遍历函数

    队列独有 为  front(),返回队头元素引用,back(),返回队尾元素引用。

    堆栈独有为 top(),返回栈顶元素的引用。

    应用总结:

    vector<int > v;

     vector<int> :: iterator it;  定义迭代器变量,主要应用于遍历。

    it=v.begin()   it=v.end()   *it(迭代器上的元素值)

    string

    string s;

    1:从string对象尾部添加字符  为 S+‘a’  或

    字符串   S+”   adff   “   或  S.append(” asff   “):

    2:string s;

    string :: iterator it;

    给string 对象插入字符  

    it=s.begin();

    s.insert(it +3, 'p');  // 将字符‘p’  插入到第3个字符前 (注,字符位置是从0开始计数) 例如:S=addfds  插入后 S=addpfds

    3;访问string元素:下标法

    string对象的元素是一个字符(char);

    4: 删除string对象的元素

    清空 S=”“;

    或删除第三个元素  it = S.begin(); S.erase(it+3);

    或删除0-4区间的所以元素   S.erase(it,it+4);

    5.S.length();   S.empty()

    6 替换字符串

    S.replace(3,4,"ffeeggg")  从第3位开始,将连续的4个字符替换成”ffeeggg“

    7.搜索 元素或字符串

    S.find(”fdsf“)  ,查找字符串S中第一个字符元素(char) 或 第一个字串(用双引号界定), 如果查到,则返回下标值 ,如果查不到,返回4294967295

    8 比较

    S.compare(”    adff“) S>adff  返回1 ,= 返回0 ,S<adff 返回-1;

    9:    string对象 可以作为vector 元素  vector<string> v;

    10:  reverse反向排序string对象

    reverse(s.begin(),s.end());

    11:

  • 相关阅读:
    Andorid中写文件后在电脑上看不到的解决办法
    【Android布局】在程序中设置android:gravity 和 android:layout_Gravity属性
    OpenCV入门学习笔记
    视频播放(iOS开发)
    音频播放(iOS开发)
    iPad开发(相对于iPhone开发时专有的API)
    静态库/内存分析/通讯录/换肤/硬件信息获取
    Alpha冲刺! Day1
    软工团队
    软工团队
  • 原文地址:https://www.cnblogs.com/zn505119020/p/3561825.html
Copyright © 2011-2022 走看看