数据结构第三章学习小结

本章主要内容:栈和队列是特殊的线性表。

顺序栈:虽然栈只需要对一段进行操作(栈顶),但我们除了栈顶指针(top)外,还需要设置栈底指针(base),主要是为了用于判断栈空栈满。由于栈顶指针永远指向栈顶元素的上面一个元素,所以栈顶指针并不指向栈顶元素,大部分时候是指向一个空的元素。当栈满时,栈顶指针将指向栈外。

:链栈:由于栈只需要对一端(栈顶)进行操作,所以不需要设置头结点。

顺序队列(循环队列):不同于栈,队列需要对两头进行操作,因此头尾指针不可缺。但这里的指针并不是指针变量,而是整形。循环队列用下标表示每个元素,因此这里的指针指的是对下标的记录。这里仍用“指针指向”表示“下标表示”

链队:但是由于指针只能指向下一个元素,因此我们将链尾作为队头,链头作为队尾。入队时只用将新的结点指向链尾,而出队时只用将队尾的指针指向下一个元素后删除最有一个结点。在删除元素中,不管有没有头结点,如果被删除的是最后一个元素,都要进行额外的操作。如果没有头结点,删除最后一个结点导致头指针和尾指针都变为野指针,因此要为他们额外赋空;如果有头结点,头指针一直指向头结点,但是尾指针会变成野指针,因此需要将尾指针额外赋空。没有哪种情况特别优越。但是如果考虑状态表示的唯一性,显然是需要头结点的。

完成作业似的心得体会:不要在一种方法不行的时候急于换另一种方法甚至是用别人的、非原创的源代码来充数,毕竟多数的错误不是思路上的而是细节上的、个人打代码能力不足而引起的细枝末节的失误。在本章的【括号匹配】专题中,我经历两次大时间块的尝试,用三种方法解出了题,这里附上另外两种源代码:

#include<iostream>
using namespace std;
typedef struct StackNode{
 char data;
 struct StackNode*next;
}StackNode,*LinkStack;
 
void InitStack(LinkStack &S)
{
 S = NULL;
}
void Push(LinkStack &S,char tmp)
{
  LinkStack p;
  p = new StackNode;
  p->data = tmp;
  p->next = S;
  S = p ;
}
void Pop (LinkStack &S, char tmp)
{
 LinkStack p;
 tmp = S->data;
 p = S;
 S = S->next;
 delete p;
 
}
int GetTop(LinkStack &S)
{
 if(S!=NULL)
 return S->data;
}
bool  StackEmpty(LinkStack &S)
{
 if(S==NULL)
 return true;
 else return false;
}

 bool Matching()
 {
  char ch;
  int flag ;
     LinkStack S;
  InitStack(S);
  char x;
  flag = 1;
  cin>>ch;
  while(flag==1)
  {
   switch(ch)
   {
    case '[':
    case '(':
     Push(S,ch);
     break;
    case ')':
     if(!StackEmpty(S)&&GetTop(S)=='(')
     Pop(S,x);
     else flag = 0;
     break;
     case ']':
      if(!StackEmpty(S)&&GetTop(S)=='[')
      Pop(S,x);
      else flag = 0;
      break;
      
   }
   cin>>ch;
  }
  if(StackEmpty(S)&&flag)
  return true;
  else return false;
  }
  
 
int main()
{
     if(Matching())
     {
      cout<<"yes";
     }
     else cout<<"no";
     return 0;
}
以上这一种是完全按照课本思路来的
#include <iostream>
using namespace std;
 
#define maxsize 100
 
struct sStack
{
     char sign[maxsize];
     int top;
};
 
int InitsStack(sStack &SS)
{
     SS.top=-1;
     return 1;
}
 
int IsEmptysStack(sStack &SS)
{
     if(SS.top==-1)
         return 1;
     return 0;
}
 
int PushsStack(sStack &SS,char c)
{
     SS.sign[++SS.top]=c;
     return 1;
}
 
int UpsStack(sStack &SS)
{
    if(IsEmptysStack(SS))
    {
         cout<<"空"<<endl;
         return 0;
    }
    SS.top--;
    return 1;
}
 
char TopsStack(sStack &SS)
{
    if(IsEmptysStack (SS))
    {
         cout <<"空"<<endl;
         return 0;
    }
    return SS.sign[SS.top];
}
 
int main()
{
     string s;
     cin>>s;
     int length=s.length();
     int i;
     sStack SS;
     InitsStack(SS);
     for(i=0;i<length;++i)
     {
           if(s[i]=='('||s[i]=='['||s[i]=='{')
                    PushsStack(SS,s[i]);
           else if(s[i]==')'&&!IsEmptysStack(SS)&&TopsStack(SS)=='(')
                UpsStack(SS);        
           else if(s[i]==')'&&!IsEmptysStack(SS)&&TopsStack(SS)!='(')
                    cout<<"no"<<endl;
           else if(s[i]==']'&&!IsEmptysStack(SS)&&TopsStack(SS)=='[')
                    UpsStack(SS);
           else if(s[i]==']'&&!IsEmptysStack(SS)&&TopsStack(SS)!='[')
                    cout<<"no"<<endl;
           else if(s[i]=='}'&&!IsEmptysStack(SS)&&TopsStack(SS)=='{')
                    UpsStack(SS);
           else if(s[i]=='}'&&!IsEmptysStack(SS)&&TopsStack(SS)!='{')
                    cout<<"no"<<endl;
           else if((s[i]==')'||s[i]==']'||s[i]=='}')&&IsEmptysStack(SS))
                    cout<<"no"<<endl;
     }
     if(!IsEmptysStack(SS))
           cout<<"no"<<endl;
     else if(i=(length-1)&&IsEmptysStack(SS))
           cout<<"yes"<<endl;
 
     return 0;
}
接下来的目标还是继续提高自己的打代码能力吧,以及对细节错误的发现能力

猜你喜欢

转载自www.cnblogs.com/luyoulan/p/10628259.html