数据结构与算法——栈和队列(1)

栈的结构体

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++


注意:入栈先加加,出栈后减减

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值