数据结构自学记录(五):栈

栈的定义:栈是一种只能在一端进行插入或删除操作的线性表。

栈的一些概念:1.允许进行插入、删除操作的一端称为栈顶。

                       2.表的另一端称为栈底。

                       3.当栈中没有数据元素时,称为空栈。

                       4.栈的插入操作通常称为进栈或入栈。

                       5.栈的删除操作通常称为退栈或出栈。

栈的主要特点:先入先出(FIFO).

栈中元素逻辑关系与线性表的相同,栈可以采用与线性表相同的存储结构,即可以使用顺序栈,也可以使用链栈.

顺序栈:

1.栈的结构定义:

typedef struct{
	int data[MAXSIZE];
	int top;    //栈顶指针
}SqStack;

顺序栈的四要素:1.栈空条件:top = -1

                          2.栈满条件:top=MaxSize-1

                          3.进栈e操作:top++  将e放在top处

总结: 1.约定top总是指向栈顶元素,初始值为-1.

          2. 当top=MaxSize-1时不能再进栈-栈满

          3.进栈时top增1,出栈时top减1

          4.退栈操作:从top处取出元素e,  top--;
栈的操作:

1.栈的初始化:

void InitStack(SqStack* &s)
{
	s = (SqStack*)malloc(sizeof(SqStacks));
	s->top = -1;
}

2.销毁栈

void DestroyStack(SqStack* &s)
{
	free(s);
}

3.判断栈是否为空

bool isEmpty(SqStack*s)
{
	return (s->top == 1)
}

4.进栈Push

bool Push(SqStack* &s,int ele)
{
	//先判断栈是否已经满了
	if(s->top == MAXSIZE-1)
		return false;
	s->top++;
	s->data[s->top] = ele;
	return true;
}

5.出栈Pop

bool pop(SqStack* &s,int &ele)
{
	if(s->top == -1)
		return false;
	e = s->data[s->top];
	s->top--;
	return true;
}

6.取栈顶元素
 

bool getTop(SqStack* &s,int &ele)
{
	if(s->top == -1)
		return false;
	e = s->data[s->top];
	return true;
}

栈的算法设计例题:设计一个算法利用顺序栈判断一个字符串是否是对 称串。所谓对称串是指从左向右读和从右向左读的序列相同。

算法设计思路:字符串str的所有元素依次进栈,产生的出栈序列正好与str的顺序相同,则是对称串

算法代码:

bool isSummetry(char str[])
{
    int i;
    char e;
    SqStack* s;
    for(i = 0;str[i] != '\0';i++)
		Push(s,str[i]);  			//依次进栈
	for(i = 0;str[i] != '\0';i++)
	{
		Pop(s,e);
		if(str[i] != e)
		{
			DestoryStack(s);
			return false;
		}
	}
	DestoryStack(s);
	return true;
}

链栈:

1.链栈的定义

typedef struct linknode
{
	int data;
	struct linknode *next;
} LiStack;

2.栈的初始化

void (LiStack *&s)
{
	s=(LiStack *)malloc(sizeof(LiStack));
	s->next=NULL;
}

3.判断栈是否为空

bool isEmpty(LiStack *s)
{
	return(s->next==NULL);
}

4.Push

//头插法
void Push(LiStack *&s,ElemType e) 
{  
	LiStack *p; 
	p=(LiStack *)malloc(sizeof(LiStack)); 
	p->data=e; 
	p->next=s->next; 
	s->next=p; 
}

5.Pop

bool Pop(LiStack *&s,ElemType &e)
{
	LiStack *p;
	if (s->next==NULL)
		return false;
	p=s->next;
	e=p->data;
	s->next=p->next;
	free(p);
	return true;
}

6.取栈顶元素

bool GetTop(LiStack *s,ElemType &e)
{
	if (s->next==NULL) //栈空的情况
		return false;
	e=s->next->data;
	return true;
}

 链栈算法设计:编写一个算法判断输入的表达式中括号是否配 对(假设只含有左、右圆括号).

 

bool Match(char exp[],int n)
{
    int i=0;
    char e;
    bool match = true;
    LiStack *st;
    InitStack(st); //初始化栈
    while (i<n && match) //扫描exp中所有字符
    {
        if (exp[i]=='(')
            Push(st, exp[i]);
        else if(exp[i]==')')
        {
            if (GetTop(st,e)==true)
            {
                if (e!='(')
                    match=false;
                else
                    Pop(st,e);
            }
            else
                match=false;
        }
    }
    i++;
    if (!StackEmpty(st))
        match=false;
    DestroyStack(st);
    return match;
}


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值