知识点二:栈

知识点:

栈是一种特殊的线性表。其特殊性在于限定插入和删除数据元素的操作只能在线性表的一端进行。后进先出(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)//topbase重合时,栈为空  

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;

}

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值