本章主要内容:栈和队列是特殊的线性表。
顺序栈:虽然栈只需要对一段进行操作(栈顶),但我们除了栈顶指针(top)外,还需要设置栈底指针(base),主要是为了用于判断栈空栈满。由于栈顶指针永远指向栈顶元素的上面一个元素,所以栈顶指针并不指向栈顶元素,大部分时候是指向一个空的元素。当栈满时,栈顶指针将指向栈外。
:链栈:由于栈只需要对一端(栈顶)进行操作,所以不需要设置头结点。
顺序队列(循环队列):不同于栈,队列需要对两头进行操作,因此头尾指针不可缺。但这里的指针并不是指针变量,而是整形。循环队列用下标表示每个元素,因此这里的指针指的是对下标的记录。这里仍用“指针指向”表示“下标表示”。
链队:但是由于指针只能指向下一个元素,因此我们将链尾作为队头,链头作为队尾。入队时只用将新的结点指向链尾,而出队时只用将队尾的指针指向下一个元素后删除最有一个结点。在删除元素中,不管有没有头结点,如果被删除的是最后一个元素,都要进行额外的操作。如果没有头结点,删除最后一个结点导致头指针和尾指针都变为野指针,因此要为他们额外赋空;如果有头结点,头指针一直指向头结点,但是尾指针会变成野指针,因此需要将尾指针额外赋空。没有哪种情况特别优越。但是如果考虑状态表示的唯一性,显然是需要头结点的。
完成作业似的心得体会:不要在一种方法不行的时候急于换另一种方法甚至是用别人的、非原创的源代码来充数,毕竟多数的错误不是思路上的而是细节上的、个人打代码能力不足而引起的细枝末节的失误。在本章的【括号匹配】专题中,我经历两次大时间块的尝试,用三种方法解出了题,这里附上另外两种源代码:
#include<iostream>
using namespace std;
using namespace std;
typedef struct StackNode{
char data;
struct StackNode*next;
}StackNode,*LinkStack;
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;
}
{
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;
}
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;
}
接下来的目标还是继续提高自己的打代码能力吧,以及对细节错误的发现能力