基础知识补充
动态分配内存
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 是为了修改指针的值,表示它现在不指向任何有效的内存地址