堆栈与队列是两种重要的基础数据结构,一个是先入后出,一个是先入先出,有着广泛的应用,本文分别使用数组与链表实现堆栈与队列
顺序存储方式实现堆栈
#define MaxSize 20
#define ERROR -1
typedef struct {int Data[MaxSize];int Top;
} Stack;Stack *CreateStack( int maxSize)
{Stack *s=(Stack*)malloc (sizeof (Stack)*maxSize);s->Top=-1 ;return s;
}
int IsFull( Stack *S, int maxSize)
{if (S->Top==maxSize-1 ){return 1 ;}else {return 0 ;}
}
void Push( Stack *S, int item )
{if (S->Top==MaxSize-1 ){printf ("the stack is full" );return ;}else {S->Data[++(S->Top)]=item;return ;}}
int IsEmpty ( Stack *S )
{if (S->Top=-1 ){return 1 ;}else {return 0 ;}
}
int Pop( Stack *S )
{if (S->Top==-1 ){printf ("the stack is empty" );return ERROR;}else {return S->Data[(S->Top)--];}
}void show(Stack *s)
{int i;for (i=0 ;i<=s->Top;i++){printf ("%d " ,s->Data[i]);}
}void main()
{int a,b;Stack *s=CreateStack(MaxSize);while (1 ){printf ("please enter your order:" );scanf ("%d" ,&a);switch (a){case 1 :scanf ("%d" ,&b);Push(s,b);break ;case 2 :Pop(s);break ;case 3 :show(s);break ;case 4 :exit (0 );break ;default :break ;}}}
链式堆栈
typedef struct Node{int Data;struct Node *Next;
} LinkStack;LinkStack *CreateStack()
{LinkStack *s=(LinkStack*)malloc (sizeof (LinkStack));s->Next=NULL;return s;
}int IsEmpty(LinkStack *s)
{return (s->Next==NULL);
}void Push( int item, LinkStack *S )
{LinkStack *TmpCell;TmpCell=(LinkStack*)malloc (sizeof (LinkStack));TmpCell->Data=item;TmpCell->Next=S->Next;S->Next=TmpCell;}int pop(LinkStack *s)
{LinkStack *firstItem;int topNum;if (IsEmpty(s)){printf ("stack is empty" );return NULL;}firstItem=s->Next;s->Next=firstItem->Next;topNum=firstItem->Data;free (firstItem);return topNum;}
void show(LinkStack *s)
{s=s->Next;while (s){printf ("%d " ,s->Data);s=s->Next;}
}void main()
{int a,b;LinkStack *s=CreateStack();while (1 ){printf ("please enter your order:" );scanf ("%d" ,&a);switch (a){case 1 :scanf ("%d" ,&b);Push(b,s);break ;case 2 :pop(s);break ;case 3 :show(s);break ;case 4 :exit (0 );break ;default :break ;}}
}
顺序存储队列
#define MaxSize 20
#define ERROR -1
typedef struct {int Data[ MaxSize ];int rear;int front;
} Queue;void AddQ( Queue *PtrQ, int item)
{if ((PtrQ->rear+1 )%MaxSize==PtrQ->front){printf ("the queue is full" );}else {PtrQ->rear=(PtrQ->rear+1 )%MaxSize;PtrQ->Data[PtrQ->rear]=item;}
}int DeleteQ ( Queue *PtrQ )
{if (PtrQ->front==PtrQ->rear){printf ("the queue is empty" );}else {PtrQ->front=(PtrQ->front+1 )%MaxSize;return PtrQ->Data[PtrQ->front-1 ];}
}
void show(Queue *PtrQ)
{int i;for (i=PtrQ->front+1 ;i<=PtrQ->rear;i++){printf ("%d " ,PtrQ->Data[i%MaxSize]);}
}void main()
{int a,b;Queue *q=(Queue*)malloc (sizeof (Queue));q->front=-1 ;q->rear=-1 ;while (1 ){printf ("please enter your order:" );scanf ("%d" ,&a);switch (a){case 1 :scanf ("%d" ,&b);AddQ(q,b);break ;case 2 :DeleteQ(q);break ;case 3 :show(q);break ;case 4 :exit (0 );break ;default :break ;}}
}
链式队列
#define ERROR - 1
typedef struct Node{int Data ;struct Node * Next;
}QNode;
typedef struct { QNode * rear; QNode * front;
} LinkQueue;LinkQueue* AddQuee(LinkQueue * PtrL,int item)
{QNode * node;node= PtrL-> rear;if (PtrL-> front== NULL ){QNode * q= (QNode* )malloc(sizeof(QNode));q-> Next= NULL ;q-> Data = item;PtrL-> front= q;PtrL-> rear= q;return PtrL;}else {QNode * q= (QNode* )malloc(sizeof(QNode));q-> Next= NULL ;q-> Data = item;node-> Next= q;PtrL-> rear= q;return PtrL;}
}int DeleteQ ( LinkQueue * PtrQ )
{QNode * firstNode;int NodeItem;if (PtrQ-> front== NULL ){printf("queue is empty" );return ERROR;}firstNode= PtrQ-> front;if (PtrQ-> front== PtrQ-> rear){PtrQ-> front= PtrQ-> rear= NULL ;}else {PtrQ-> front= PtrQ-> front-> Next;}NodeItem= firstNode-> Data ;free(firstNode);return NodeItem;
}void show(LinkQueue * q)
{QNode * node;node= q-> front;while (node){printf("%d " ,node-> Data );node= node-> Next;}
}void main()
{int a,b;LinkQueue * q= (LinkQueue* )malloc(sizeof(LinkQueue));q-> front= NULL ;q-> rear= NULL ;while (1 ){printf("please enter your order:" );scanf("%d" ,& a);switch (a){case 1 :scanf("%d" ,& b);q= AddQuee(q,b);break;case 2 :DeleteQ(q);break;case 3 :show(q);break;case 4 :exit(0 );break;default:break;}}
}