知识点:
栈
栈是一种特殊的线性表。其特殊性在于限定插入和删除数据元素的操作只能在线性表的一端进行。后进先出(Last In First Out),简称为LIFO线性表。
构造空栈:InitStack(S):
1. struct Stack//建立栈
2. {
3. int value[MAX];
4. int top;//栈顶的数组序号
5. };
6. void Init(Stack &s)//初始化栈
7. {
8. s.top=-1;
9. }
判栈空: StackEmpty(S):
1. int IsEmpty(Stack s)//判定栈是否为空
2. {
3. if(s.top==-1)
4. return 1;
5. else
6. return 0;
7. }
判栈满: StackFull(S)、
进栈: Push(S,x)、可形象地理解为压入,这时栈中会多一个元素:
1. int Push(Stack &s,int e)//把元素e压入栈顶
2. {
3. if(s.top>MAX-1)//如果超出栈的容量,返回0
4. return 0;
5. s.top++;//栈顶加1
6. s.value[s.top]=e;//把e赋给栈顶
7. return 1;
8. }
退栈: Pop(S) 、可形象地理解为弹出,弹出后栈中就无此元素了:
1. int Pop(SqStack &s,int &e)//取出栈顶元素,并删除栈顶
2. {
3. if(s.top==s.base)//top与base重合时,栈为空
4. return 0;
5. s.top--;//top先减1,再取元素
6. e=*s.top;
7. return 1;
8. }
取栈顶元素:StackTop(S),不同与弹出,只是使用栈顶元素的值,该元素仍在栈顶不会改变。
销毁栈:Destory(S):
1. void Destroy(SqStack &s)//销毁栈
2. {
3. free(s.base);
4. //delete s.base;//如果使用new分配内存,则用delete删除。
5. }
题目分析: http://acm.hdu.edu.cn/showproblem.php?pid=1022;
考虑:
1、 只有出栈和入栈
2、 栈顶元素的值和目标是否一样,一样的话直接出栈
3、 记录全部的进出顺序并输出
题解代码:
// acm1.cpp: 定义控制台应用程序的入口点。
//
#include"stdafx.h"
#include<iostream>
#include<stack>
usingnamespace std;
int main()
{
int n, flag[100];
char in[100],out[100];
while (cin >> n)
{
cin>> in>> out;
stack<char> s;
int i = 0, j = 0;
for (i; i <= n;)
{
if (s.empty())
{
s.push(in[i]);
flag[i+ j] = 0;
i++;
}
if (!s.empty()&& s.top() != out[j])
{
s.push(in[i]);
flag[i+ j] = 0;
i++;
}
if (!s.empty()&& s.top() == out[j])
{
s.pop();
flag[i+ j] = 1;
j++;
}
}
if (s.empty())
{
cout<< "Yes." << endl;
for (i = 0; i<2 * n;i++)
{
if (flag[i] != 1)cout<< "in" << endl;
else cout << "out" << endl;
}
cout<< "FINISH" << endl;
}else
{
cout<< "No." << endl;
cout<< "FINISH" << endl;
}
}
return 0;
}