栈和队列可以看作是特殊的线性表,是运算受限的线性表
注:进栈操作可以 如下表示:Push(栈名,进栈元素);出栈操作可以如下表示:Pop(栈名,出栈元素)
int InitStack(SeqStk *stk)
{
stk——>top=0;
return 1;
}
int EmptyStack(SeqStk *stk)
//若栈为空,则返回1,否则返回0
{
if (stk->top==0)
return 1;
else return 0;
}
int Push(SeqStk *stk,DataType x)
{
IF (stk->top==maxsize-1)
{error("栈已满");return 0;}
else { stk->top++; //栈未满,top+1
stk->data[stk->top]=x; //元素x进栈
return 1;
}
}
int Pop(SeqStk *stk)
{
if {EmptyStack(stk)
{error("下溢");return 0;}
else
{
stk->top--;
return 1;
}
}
DataType GetTop(SeqStk *stk)
{ if(EmptyStack(stk))
return NULLData;
else
return stk->data[stk->top];
}
const int max=40;
typedef struct Dbstack
{
DataType data[max];
int top1,top2;
}DbStk;
注:双栈判断上溢为top1+1=top2;判栈空为top1=0时,栈1为空;top2=max-1时栈2为空
void InitStack(LkStk *LS)
{
LS=(LkStk *)malloc(sizeof(LkStk));
LS->next=Null;
}
int EmptyStack(LkStk *LS)
//若栈为空则返回值为1,否则返回0
{
if(LS->next==NULL)
retun 1;
else
return 0;
}
void Push(LkStk *LS,DataType x)
{
LkStk *temp;
temp=(LkStk *)mallloc(sizeof(LkStk)); //temp指向申请的新结点
temp->data=x; //新结点的data域赋值为x
temp->next=LS->next; //temp的next域指向原来栈顶结点
LS->next=temp; //指向新的栈顶结点
}
int Pop(LkStk *LS)
//栈顶元素通过参数返回,直接后继成为新栈顶
{
LkStk *temp;
if(!EmptyStack(LS))
{
temp=LS->next; //temp指向栈顶结点
LS->next=temp->next; //原栈顶的下一个结点成为新栈顶
free(temp); //释放原栈顶结点空间
return 1;
}
else rturn 0;
}
DataType GetTop(LkStk *LS)
{
if (!EmptyStack(LS))
return LS->next->data; //若栈为非空,返回栈顶数据元素
else
return NULLData; //返回空元素
}
//求3的阶乘
#include
long f(int n){
if(n==0)
return 1;
else
return n*f(n-1);
}
main(){
int m,n=3;
m=f(n);
printf("%d!=%d\n",n,m)
}
const int maxsize=20;
typeof struct seqqueue
{
DataType data[maxsize];
int font,rear;
}SeqQue;
SeqQue SQ;
SQ.rear=SQ.rear+1;
SQ.data[SQ.rear]=x;
出队列操作:
SQ.front=SQ.front+1;
SQ.rear=(SQ.rear+1)%maxsize;
SQ.data[SQ.rear]=x;
出队列操作为:
SQ.front=(SQ.front+1)%maxsize;
判队列满条件为:
((SQ.rear+1)%maxsize==SQ.front)
判断队列空的条件为:
(SQ.rear==SQ.front)
void InitQueue(CyQue CQ)
{
CQ.front=0;
CQ.front=0;
}
int EmptyQueue(CycQue CQ)
{
if(CQ.rear==CQ.front)
return 1;
else
return 0;
}
int EnQueue(CycQue CQ,DataType x)
{
if ((CQ.rear+1)%maxsize==CQ.front)
{error("队列满");return 0;} //队列满,入队列失败
else{
CQ.rear=(CQ.rear+1)%maxsize;
CQ.data[CQ.rear]=x;
return 1;
{
}
int OutQueue(CycQue CQ)
{
if(EmptyqUEUE(CQ))
{error("队列空");return 0;}
else{
CQ.front=(CQ.front+1)%maxsize; //不为空,出队列
return 0;
}
}
DataType GetHead(CycQue CQ)
{
if (EmptyQueue(CQ))
return NULLData;
else
return CQ.data[(CQ.front+1)%maxsize];
}
void InitQueue(LkQue *LQ)
{
LkQueNode *temp;
temp=(LkQueNode *)malloc(sizeof(LkQueNode)); //生成队列的头结点
LQ->front=temp; //队列头指针指向队列头结点
LQ->rear=temp; //尾结点指向列尾结点
(LQ->front)->next=NULL;
}
int EmptyQueue(LkQue LQ)
{
if(LQ.rear==LQ.front)
return 1; //队列为空
else
return 0;
}
void EnQueue(LkQue *LQ,DataType x)
{
LkQueNode *temp;
temp=(LkQueNode *)malloc(sizeof(LkQueNode));
temp->data=x;
temp->next=NULL;
(LQ->rear)->next=temp; //新结点入队列
LQ->rear=temp; //置新的队列尾结点
}
OutQueue(LkQue *LQ)
{
LkQueNode *temp;
if(EmptyQueuq(CQ))
{error("队空");retturn 0;}
else{
temp=(LQ->front)->next; //使temp指向队列的首结点
(LQ——>front)——>next=temp->next; //修改头结点的指针域指向新的首结点
if(temp->next=NULL)
LQ->rear=LQ->front;
free(temp);
return 1;
}
}
DataType GetHead(LkQue LQ)
{
LkQueNode *temp;
if(EmptyQueue(CQ))
return NULLData;
else{
temp=LQ.front->next;
return temp->data; //队列非空,返回队列首结点元素
}
}
//a[行][列]
a[3][4]
aij=aji 0<=i,j<=n-1
注:设矩阵aij在数组M中位置为k,(i,j)和k存在如下关系:
- 稀疏矩阵中所有非零元素用三元组的形式表示,并按照一定的次序组织在一起,就形成了三元组表示法
注:v为非零元素,i为非零元素v所在矩阵的行号,j为所在矩阵的列号