hdu 1022 (栈)STL容器的应用

来源:互联网 发布:网络品牌策略研究论文 编辑:程序博客网 时间:2024/05/18 11:27

进入和输出的数组为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         else31         {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 1211 #define IN 012 #define OUT 113 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         else36 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                 else62                     cout<<"in"<<endl;63             }64 65         }66         else67         {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:

0 0