栈和队列日常

基础知识补充

动态分配内存

C malloc

  • 分配单个对象的内存

    int* p=(int*)malloc(sizeof(int))
    
  • 分配数组的内存

    int* arr=(int*)malloc(5*sizeof(int))
    //分配5个int类型元素
    
  • 释放内存

    free(p);
    free(arr);
    

C++ new

  • 分配单个对象的内存

    int* p=new int;
    
  • 分配数组的内存

    int* arr=new int[5]
    
  • 释放内存

    delete p;        
    delete[] arr; 
    

结构体

结构体定义 typedef struct 用法详解和用法小结-优快云博客

直接赋值:同类型结构体变量可以整体赋值 st2 = st1

结构体指针

**间接赋值: **

struct student st1={"10000,zhan"},st2,*p,*q;
p=&st1,q=&st2;
*q=*p;

引用结构体成员:

  • (*结构体指针变量).成员名
  • 结构体指针变量->成员名

顺序栈

顺序栈的定义

struct SqStack{
    ElemType *base; //栈底指针
    ElemType *top;  //栈顶指针
    int stacksize;  //栈可用最大容量
}

栈的初始化

bool InitStack(SqStack &S)
{
    S.base = new ElemType[MAXSIZE];//注意是数组
    if(!S.base) //存储分配失败
    {
		cout<<"failed to get memory"<<endl;
        return false;
    }
    S.top = S.base;
    S.stacksize = MAXSIZE;
    return true;
}

创建栈

bool CreateStack(SqStack &S,const int n)
{
	for(int i=0;i<n;i++)
    {
		ElemType input;
        cin>>input;
        if(!Push(S,input))
        {
            return false;
        }
    }
    return true;
}

入栈

bool Push(SqStack &S,ElemType &e)
{
    if(S.top - S.base == S.stacksize) //先判断栈有没有满
    {
        cout<<"full of stack"<<endl;
        return false;
    }
    *(S.top)=e;
    S.top++;
    return true;
}

出栈

bool Pop(SqStack &S,ElemType &e)
{
	if(S.top == S.base)//先判断栈空
    {
		cout<<"empty stack"<<endl;
        return false;
    }
    S.top--;
    e = *(S.top);
    return true;
}

判断空栈

bool StackEmpty(SqStack &S)
{
	if(S.top == S.base) return true;
    else return false;
}

顺序栈的长度

int StackLength(SqStack &S)
{
	return S.top - S.base;
}

清空顺序栈

bool ClearStack(SqStack &S)
{
	if(S.base) 
    {
        S.top = S.base;
    	return true;
    }
    else return false;
}

销毁顺序栈

void DestroyStack(SqStack &S)
{
	if(S.base)
    {
        delete[] S.base; //注意是数组
        S.stacksize = 0;
        S.base = S.top = nullptr; 
        //nullptr专门赋给指针,比NULL更好
    }
}
//delete  释放指针指向的内存
//nullptr 是为了修改指针的值,表示它现在不指向任何有效的内存地址

链栈

链栈只能在链表头部进行操作,就是说在头结点进行插入删除

头指针作为栈顶,这样才能找到下一个元素

链栈的定义

typedef struct StackNode
{
	ElemType data;
    StackNode *next;//存储链表的下一个节点地址所以是StackNode
}*LinkStack;

栈的初始化

void InitStack(LinkStack &S)
{
    S = nullptr;
}

创建栈

void CreateStack(LinkStack &S,const int n)
{
    ElemType input;
    for(int i=0;i<n;i++)
    {
		cin>>input;
        Push(S,input);
    }
}

压栈

void Push(LinkStack &S,ElemType &e )
{
    StackNode *p = new StackNode;
    p->data = e;
    p->next = S;
    S = p;
}

弹栈

void Pop(LinkStack &S,ElemType &e)
{
	if(S == nullptr) return;
    StackNode *p = S;
    e = p->data;//为了将出栈的元素值返回给调用者
    S = S->next;
    delete p;
}

判断空栈

bool StackEmpty(LinkStack &S)
{
	if(S == nullptr) return true;
    else return false;
}

清空栈

void ClearStack(LinkStack &S)
{
    while(S!=nullptr)
    {
        StackNode *p=S;
        S=S->next;
        delete p;
    }
}

销毁栈

void DestoryStack(LinkStack &S)
{
	ClearStack(S);
    S=nullptr;
}
//delete  释放指针指向的内存
//nullptr 是为了修改指针的值,表示它现在不指向任何有效的内存地址


队列

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

JaneHan_

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值