栈的结构体
typedef struct stack{
int top;
int data[maxsize];
}
队列的结构体
typedef struct queue{
int data[maxsize];
int front,rear;
}
1.栈的基本操作
void init(stack &s)
{
s.top=-1;
}
bool isempty(stack &s)
{
if(s.top==-1)
{return true;}
else
{return false;}
}
bool push(stack &s,int x)
{
if(s.top==maxsize-1)
{return false;}
s.data[++s.top]=x;
return true;
}
bool pop(stack &s,int &x)
{
if(s.top==-1)
return false;
x=s.data[s.top--];
return true;
}
bool get_top(stack &s,int &x)
{
if(s.top==-1)
return false;
x=s.data[s.top];
return true;
}
思想:
初始化:只需将top(里面第几个数)开始赋值为-1
判断为空:top为-1,没有元素添加
入栈:先判断栈是否已经满,若未满则添加元素,注意++s.top先加加因为要从数组下标从0开始
出栈:同入栈相反需要判断是否有元素,若有元素则用x返回栈顶元素。这里不用如入栈考虑,直接后减减即可。
栈顶:判断是否为空,将栈顶元素反出即可。
2.判断单链表是否都是回文字符
bool func(LNode*L)
{
LNode*p=L->next;
stack s;
s.top=-1;
while(p->next!=NULL)
{
s.data[++s.top]=p->data;
p=p->next;
}
p=L->next;
while(p!=NULL)
{
if(s.data[s.top--]!=p->data)
return flase;
p=p->next;
}
return true;
}
思想:
我们利用栈进行保存单链表的每个元素。
由于栈是先进后出,我们将每个出栈的元素(即栈顶)和单链表第一个开始往后遍历元素比较,相当于一头一尾进行比较。
若不相等则为flase。
3.判断圆括号是否匹配
bool match(char A[])
{
stack s;
s.top=-1;
for(int i=0;A[i]!='\0';i++)
{
if(A[i]=='(')
s.data[++s.top]=='(';
if(A[i]==')')
if(s.top==-1)
return false;
else
s.top--;
}
if(s.top==-1)
return true;
return false;
}
思想:
对这个字符串进行遍历,如果等于左括号将其保存到栈中,如果下次遇到右括号则将与左括号相消,即s.top--。若s.top=-1证明里面没有左括号,那么匹配失败。
最后进行判断是否top等于-1来进行判断匹配是否正确。
4.假设序列HSSHHHS,将S全部提H前
void func(char A[])
{
stack s;
s.top=-1;
int k=0;
for(int i=0;A[i]!='\0';i++)
{
if(A[i]=='H')
s.data[++s.top]='H';
else
A[k++]='H';
}
while(s.top!=-1)
A[k++]=s.data[s.top--];
}
思想:
我们用栈进行保存所有的H,设置k等于0当为s时直接赋值给A[k],剩余的进行出栈
5.s1、s2共享栈存储区0到maxsize-1。设计出栈入栈。
typedef struct{
int data[maxsize];
int top1;
int top2;
}stack;
bool push(stack &s,int i,int x)
{
if(s.top2-s.top1=1||i>2||i<1)
return false;
if(i==1)
s.data[++s.top1]=x;
if(i==2)
s.data[--s.top2]=x;
return true;
}
bool pop(stack& s,int i,int& x)
{
if(i>2||i<1)
return flase;
if(i==1)
if(s.top1==-1)
return false;
else
x=s.data[s.top1--];
if(i==2)
if(s.top2==maxsize)
return false
else
x=s.data[s.top2++];
return true;
}
思想:
设置一个数组
设置两个top一个为-1,另一个为maxsize
入栈:判断合法性,如果s.top2-s.top1=1说明已经满了,没办法再插入,i用来选择是用第一个插入还是第二个插入。
如果是1则与正常相同,若为2那么我们是将新的数据插入到当前的前面。所以--s.top2
出栈:判断i的合法性
如果为1,我们要先判断是否为空,若s.top=-1则为空,出栈和之前一样
如果为2,s.top=maxsize为空,这里的出栈是将前面的元素出栈,由此可得top当前所指向位置往后移动了,所以top2++
注意:入栈先加加,出栈后减减