step3 . day4 数据结构之线性表 栈和队
補充一下:循環(huán)鏈表初學可能不好理解,除了多畫圖以外,把循環(huán)鏈表想象成無限的單向(或者雙向)鏈表,每一個元素都是中間元素,就更好理解了。
1.棧和隊是線性表的兩種特殊管理邏輯,兩者都是線性表
2.棧的原則是先入后出FILO(first in last out),類似桶裝餅干,最后裝入的先被取出用掉,只能在棧頂進行壓棧和彈棧操作
3.隊的原則是先入先出FIFO(first in first out),類似水管,流出的水是先進入的水,只能在隊尾插入,隊首刪除操作。
?
①棧的順序存儲結構實現(xiàn),和順序鏈表一樣,只是需要遵從棧的規(guī)則
②棧的鏈表結構實現(xiàn)
#include<stdio.h>
#include <stdlib.h>
typedef int datatype;
typedef struct stack{
 datatype data;
 struct stack * next; //棧頂?shù)奈恢?br />}linkstack;
//1. 創(chuàng)建一個空棧 
linkstack *linkstack_create()
{
 linkstack *s = NULL;
 s = (linkstack *)malloc(sizeof(linkstack));
s->next = NULL;
 return s;
}
//2. 入棧操作 壓棧 
void linkstack_push(linkstack *s,int value)
{
 linkstack * temp = linkstack_create();
 temp->data = value;
while(s->next != NULL){ s = s->next;}
 temp->next = s->next;
 s->next = temp;
}
//判斷棧為空
int linkstack_is_empty(linkstack *s)
{
 return s->next == NULL ? 1 : 0;
}
//4.出棧 彈棧 
int linkstack_pop(linkstack *s)
{
 if(linkstack_is_empty(s) == 1)
 {
 printf("stack is empty.\n");
 return -1;
 }
 int value;
 linkstack * temp;
 while(s->next->next != NULL){ s = s->next;}
 value = s->next->data;
 temp = s->next;
 s->next = NULL;
 free(temp);
 temp = NULL;
 return value;
}
//打印棧里面的所有值
int linkstack_show(linkstack *s)
{
 if(linkstack_is_empty(s) == 1)
 {
 printf("stack is empty.\n");
 return -1;
 }
 while(s->next !=NULL){
 printf("%d ",s->next->data);
 s = s->next;
 }
 printf("\n");
 return 0;
}
int main(int argc, const char *argv[])
{
 linkstack *s = NULL;
 s = linkstack_create();
 linkstack_push(s,1);
 linkstack_push(s,2);
 linkstack_push(s,3);
 linkstack_push(s,4);
 linkstack_push(s,5);
 linkstack_push(s,6);
linkstack_show(s);
 printf("%d \n",linkstack_pop(s));
 linkstack_show(s);
 return 0;
}
③隊的順序存儲實現(xiàn),需要掌握的隊首和隊尾值之間的相互取余關系,實現(xiàn)循環(huán)隊列
#include <stdio.h>
#include <stdlib.h>
#define N 32
typedef struct queue{
 int date[N];
 int front;
 int rear;
}sequeue;
sequeue * sequeue_creat(){
 sequeue * q = NULL;
 q = (sequeue*)malloc(sizeof(sequeue));
 q->front = 0;
 q->rear = 0;
 return q;
}
int sequeue_is_full(sequeue *q){
 return (q->rear + 1) % N == q->front ? 1 : 0;
}
int sequeue_is_empty(sequeue *q){
 return q->rear == q->front ? 1 : 0;
}
int sequeue_input(sequeue *q,int value){
 if(sequeue_is_full(q)){
 printf("sequeue_is_full\n");
 return -1;
 }
 q->date[q->rear] = value;
 q->rear = (q->rear + 1) % N; 
 return 0;
}
int sequeue_output(sequeue * q){
 if(sequeue_is_empty(q)){
 printf("sequeue_is_empty\n");
 return -1;
 }
 int value;
 value = q->date[q->front];
 q->front = (q->front+1) % N;
 return value;
}
void sequeue_show(sequeue* q){
 int i = 0;
 for(i = q->front;i != q->rear;i = ((i+1) % N)){
 printf("%d ",q->date[i]);
 }
 printf("\n");
}
?
int main(int argc, const char *argv[])
{
 sequeue *q =NULL;
 q = sequeue_creat();
 sequeue_input(q,1);
 sequeue_input(q,2);
 sequeue_input(q,3);
 sequeue_input(q,4);
 sequeue_input(q,5);
 sequeue_input(q,6);
sequeue_show(q);
 printf("%d\n",sequeue_output(q));
 sequeue_show(q);
 return 0;
}
③隊的鏈表存儲形式實現(xiàn),和單向鏈表類似,注意保持front和priv指針
#include <stdio.h>
#include <stdlib.h>
//隊成員結構體
typedef struct linkqueue{
 int date;
 struct linkqueue * next;
}linkqueue;
//隊首尾指針結構體
typedef struct lnqueue{
 struct linkqueue * front;
 struct linkqueue * priv;
}lnqueue;
//節(jié)點創(chuàng)建函數(shù)
linkqueue * linkqueue_creat(){
 linkqueue * head = NULL;
 head = (linkqueue*)malloc(sizeof(linkqueue));
 head->next = NULL;
 return head;
}
//隊頭及隊指針創(chuàng)建
lnqueue * lnqueue_creat(){
 linkqueue * head =NULL;
 head = linkqueue_creat();
 lnqueue* ln = NULL;
 ln = (lnqueue *)malloc(sizeof(lnqueue));
 ln->front = head;
 ln->priv = head;
}
//進隊 尾插
void lnqueue_input(lnqueue * ln,int value){
 linkqueue * temp =NULL;
 temp = linkqueue_creat();
 temp->date = value;
 temp->next = ln->priv->next;
 ln->priv->next = temp;
 ln->priv = temp;
}
//判斷是否位空隊
int lnqueue_is_empty(lnqueue *ln){
 return ln->front == ln->priv ? 1 : 0;
}
//遍歷
int lnqueue_show(lnqueue * ln){
 if(lnqueue_is_empty(ln)){
 printf("lnqueue_is_empty\n");
 return -1;
 }
 linkqueue *temp = ln->front; 
 while(temp->next != NULL){
 printf("%d ",temp->next->date);
 temp = temp->next;
 }
 printf("\n");
 return 0;
}
//出隊 頭刪
int lnqueue_output(lnqueue * ln){
 if(lnqueue_is_empty(ln)){
 printf("lnqueue_is_empty\n");
 return -1;
 }
 linkqueue * temp =NULL;
 int value;
 temp = ln->front->next;
 value = temp->date;
 ln->front->next = temp->next;
 if(ln->priv == temp){
 ln->priv = ln->front;
 }
 free(temp);
 temp = NULL;
return value;
}
?
int main(int argc, const char *argv[])
{
 lnqueue * ln = NULL;
 ln = lnqueue_creat();
 lnqueue_input(ln,1);
 lnqueue_input(ln,2);
 lnqueue_input(ln,3);
 lnqueue_input(ln,3);
 lnqueue_input(ln,3);
 lnqueue_input(ln,6);
lnqueue_show(ln);
 printf("%d\n",lnqueue_output(ln));
 lnqueue_show(ln);
 printf("%d\n",lnqueue_output(ln));
 lnqueue_show(ln);
 printf("%d\n",lnqueue_output(ln));
 lnqueue_show(ln);
 printf("%d\n",lnqueue_output(ln));
 lnqueue_show(ln);
 printf("%d\n",lnqueue_output(ln));
 lnqueue_show(ln);
 printf("%d\n",lnqueue_output(ln));
 lnqueue_show(ln);
 printf("%d\n",lnqueue_output(ln));
 lnqueue_show(ln);
 return 0;
}
?
轉載于:https://www.cnblogs.com/huiji12321/p/11233942.html
總結
以上是生活随笔為你收集整理的step3 . day4 数据结构之线性表 栈和队的全部內容,希望文章能夠幫你解決所遇到的問題。
 
                            
                        - 上一篇: step3 . day3 数据结构之线性
- 下一篇: 信息发布webpart——网页编辑器应用
