Stack Queue

stack:LIFO(last in first out,後進先出)
說明:一種有序串列,但限制插入運作和刪除運作而在top(頂端)進行,也就是最後插入的資料會先被移走
應用:副程式的呼叫與返回,遞迴副程式的處理,運算式的計算…
主要運作:宣告一個空堆疊,插入,取出,判別是否為空,回傳頂端資料…
ps:若將佇列的插入運作和刪除運作都發生在尾端,及可達到堆疊的效果

鏈結表示的運作
void push(int x){
 struct node *temp;
 temp=(struct node *)malloc(sizeof(struct node)); //產生新節點
 temp->data=x;
 temp->next=top; //將新節點指向top所指節點
 top=temp; //將top變數改成指向新節點
}
int pop(void){
 int x; struct node *temp;
 if(top==null){ printf(stack is empty); } //判斷是否為空
 else{
  temp=top; //將temp指向top所指節點
  top=temp->next; //將top節點變成的指向下一個節點
  x=temp->data;
  free(temp); //歸還temp所指節點
 }
 return(x);
}

前序,中序,後序轉換及計算
中序轉後序
ex:a+e*c/d-e
1, ((a+((e*c)/d))-e) //依運算順序加括號
2 , aec*d/+e- //將各運算子移到對應的右括號
中序轉前序演算法
1,將中序運算式先反轉,達到由後向前處理的順序
2,在尾端放上一結束符號
3,將值取出一直到碰到結束符號
4,假如值=數字,則將數字放入result的堆疊中
假如值=運算符號,則將運算符號放入expr的堆疊中


…………….


queue:FIFO(first in first out,先進先出)
說明:一種有序串列,但限制插入運作在rear(尾端),而刪除運作在front(前端),也就是第一個插入的資料會先被移走
應用:工作元的規畫,輸入輸出要求的處理,電腦模擬系統的執行

ps:
priority queue
在fifo中在增加一個priority元素
用途:提供insert,delete,search運作

用循序表示法來表示一個佇列
事先宣告:
datatype queue[1-n]; //宣告能存放n個資料的陣列
int front=1; //指向要取出資料的位置
int rear=1; //指向要插入資料的位置
使用線性佇列時:
rear=rear+1 //插入資料時+1
front=front+1 //取出資料時+1
當front=rear時表empty
而rear=n時表示己滿,若左邊有空間則將資料左移,但這方法十分沒效率
使用環狀佇列circular時:
rear=(rear mod n)+1 //插入資料時+1,但當rear為n時,下一個插入資料的位置就會在最左邊
front=(front mod n)+1 //取出資料時+1,但front的值到n後會自動變回1
當front=rear時表empty
判斷是否有滿的方法:
1,只允許n-1個資料放入佇列,也就是(rear mod n)+1==front時則表示滿
2,加入count變數,表示目前佇列內資料個數

queue循序表示法
插入資料
void insert(int x){
 temp=(rear mod n)+1; //1將rear除n取餘數+1
 if(temp==front){printf(“queue is full”);} //2,判斷是否己滿,若滿則實際資料只有n-1個,並且不要將rear加1(因為取資料時會被誤判為空)
 else{
  rear=temp; //若沒滿才可將rear加1
  queue[rear]=x; //3將資料存放到rear存指位置
 }
}
取出資料
void delete(){
 if(rear==front){printr(“queue is empty”);} //1判斷是否為空
 else{
  front=(front mod n)+1; //2將front除n取餘數+1
  return(queue[front]); //3取出資料
 }
}

//環狀queue的加入資料,p指最晚加入節點,因為是環狀所以p->link則指到第一個加入的節點
void add(int x){
 struct node *temp;
 temp=(struct node *)malloc(sizeof(struct node)); //產生新節點
 temp->data=x;
 if(p==nil){ temp->link=temp;} //若queue為空,則指向自己
 else{
  temp->link=p->link; //讓新節點temp指到第一個加入的節點
  p->link=temp; //讓原本最晚加入的節點指到新節點
 }
 p=temp; //記住最後一個節點
}
//環狀queue刪除或取出資料
int delete(){
 struct node *temp;int x;
 if(p==nil){print(“the quese is empty”) ;}
 else{
  temp=p->link; //把最前面的節點給temp節點
  x=temp->data; //若要回傳資料則加
  if(temp==p){p=nil;} //若只有一個節點,等下就會消失
  else{
   p->link=temp->link; //將最前面節點的下個節點位置給最後節點
   free(temp);
   return(x); //若要回傳資料則加
  }
 }
}