堆栈与队列是两种重要的基础数据结构,一个是先入后出,一个是先入先出,有着广泛的应用,本文分别使用数组与链表实现堆栈与队列
顺序存储方式实现堆栈
#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;}}
}