栈 LIFO
顺序存储
typedef int elemtype;
typedef struct stack{
elemtype *base,*top;
}stack;
初始化
void init_stack(stack& sqstack){
sqstack.base = new elemtype[maxsize];
if(!sqstack.base) exit(OVERFLOW);
sqstack.top=sqstack.base;
}
入栈
void push(stack& sqstack,elemtype e){
if(sqstack.top-sqstack.base == maxsize) return ;
*sqstack.top = e;
sqstack.top++;
}
出栈
void pop(stack& sqstack,elemtype *e){
if(sqstack.top == sqstack.base) return;
*e = *(--sqstack.top);
}
整体代码
#include<iostream>
using namespace std;
#include<stdlib.h>
#include<math.h>
#define maxsize 20
typedef int elemtype;
typedef struct stack{
elemtype *base,*top;
}stack;
void init_stack(stack& sqstack);
void push(stack& sqstack,elemtype e);
void pop(stack& sqstack,elemtype *e);
int main(){
stack sqstack;
init_stack(sqstack);
push(sqstack,56);
push(sqstack,32);
elemtype e;
pop(sqstack,&e);
cout<<e<<endl;
pop(sqstack,&e);
cout<<e<<endl;;
return 0;
}
void init_stack(stack& sqstack){
sqstack.base = new elemtype[maxsize];
if(!sqstack.base) exit(OVERFLOW);
sqstack.top=sqstack.base;
}
void push(stack& sqstack,elemtype e){
if(sqstack.top-sqstack.base == maxsize) return ;
*sqstack.top = e;
sqstack.top++;
}
void pop(stack& sqstack,elemtype *e){
if(sqstack.top == sqstack.base) return;
*e = *(--sqstack.top);
}
链式存储
typedef int elemtype;
typedef struct node{
elemtype data;
struct node *next;
}node,*link_node;
typedef struct Stack{
link_node top;
int length;
}Stack;
入栈
void push(Stack &stack,elemtype e){
link_node p = new node;
p->data = e;
p->next = stack.top;
stack.top = p;
stack.length ++;
}
出栈
void pop(Stack &stack,elemtype *e){
if(stack.top == NULL) return;
link_node p=stack.top;
stack.top = p->next;
*e = p->data;
delete p;
stack.length--;
}
整体代码
#include<iostream>
using namespace std;
typedef int elemtype;
typedef struct node{
elemtype data;
struct node *next;
}node,*link_node;
typedef struct Stack{
link_node top;
int length;
}Stack;
void push(Stack &stack,elemtype e);
void pop(Stack &stack,elemtype *e);
int main(){
Stack stack;
stack.top = NULL;
stack.length = 0;
push(stack,12);
push(stack,10);
elemtype e;
pop(stack,&e);
cout<<e<<endl;
pop(stack,&e);
cout<<e<<endl;
return 0;
}
void push(Stack &stack,elemtype e){
link_node p = new node;
p->data = e;
p->next = stack.top;
stack.top = p;
stack.length ++;
}
void pop(Stack &stack,elemtype *e){
if(stack.top == NULL) return;
link_node p=stack.top;
stack.top = p->next;
*e = p->data;
delete p;
stack.length--;
}
队列 FIFO
顺序结构 – 循环队列(解决假溢出)
typedef int elemtype;
typedef struct queue{
elemtype data[maxsize];
int head,tail;
int length;
} Squeue;
初始化
void init_queue(Squeue &queue){
queue.head=queue.tail=0;
queue.length = 0;
}
入队
void en_queue(Squeue &queue,elemtype e){
if(queue.length == maxsize) return;
queue.data[queue.tail] = e;
queue.tail = (queue.tail+1)%maxsize;
queue.length=(queue.tail-queue.head+maxsize)%maxsize;
}
出队
void de_queue(Squeue &queue,elemtype *e){
if(queue.length == 0) return ;
*e = queue.data[queue.head];
queue.head = (queue.head+1)%maxsize;
queue.length=(queue.tail-queue.head+maxsize)%maxsize;
}
整体代码
#include<iostream>
using namespace std;
#define maxsize 4
typedef int elemtype;
typedef struct queue{
elemtype data[maxsize];
int head,tail;
int length;
} Squeue;
void init_queue(Squeue &queue);
void en_queue(Squeue &queue,elemtype e);
void de_queue(Squeue &queue,elemtype *e);
int main(){
Squeue queue;
init_queue(queue);
en_queue(queue,10);
en_queue(queue,11);
en_queue(queue,12);
elemtype e;
de_queue(queue,&e);
cout<<e<<endl;
de_queue(queue,&e);
cout<<e<<endl;
en_queue(queue,13);
en_queue(queue,14);
de_queue(queue,&e);
cout<<e<<endl;
de_queue(queue,&e);
cout<<e<<endl;
de_queue(queue,&e);
cout<<e<<endl;
return 0;
}
void init_queue(Squeue &queue){
queue.head=queue.tail=0;
queue.length = 0;
}
void en_queue(Squeue &queue,elemtype e){
if(queue.length == maxsize) return;
queue.data[queue.tail] = e;
queue.tail = (queue.tail+1)%maxsize;
queue.length=(queue.tail-queue.head+maxsize)%maxsize;
}
void de_queue(Squeue &queue,elemtype *e){
if(queue.length == 0) return ;
*e = queue.data[queue.head];
queue.head = (queue.head+1)%maxsize;
queue.length=(queue.tail-queue.head+maxsize)%maxsize;
}
链式存储
typedef int elemtype;
typedef struct node{
elemtype data;
struct node *next;
}node,*link_node;
typedef struct queue{
node head;
link_node tail;
}Queue;
初始化
void init_queue(Queue &queue){
queue.head.data=0;
queue.head.next = NULL;
queue.tail= &queue.head;
}
入队
void en_queue(Queue &queue,elemtype e){
link_node p;
p = new node;
if(!p) exit(OVERFLOW);
p->data = e;
p->next = NULL;
queue.tail->next= p;
queue.tail = p;
queue.head.data++;
}
出队
void de_queue(Queue &queue,elemtype *e){
if(queue.head.data == 0) return ;
link_node p=queue.head.next;
*e=p->data;
queue.head.next = p->next;
delete p;
queue.head.data--;
if(queue.head.data == 0) queue.tail = &queue.head ;
}
整体代码
#include<iostream>
using namespace std;
#include<math.h>
#include<stdlib.h>
typedef int elemtype;
typedef struct node{
elemtype data;
struct node *next;
}node,*link_node;
typedef struct queue{
node head;
link_node tail;
}Queue;
void init_queue(Queue &queue);
void en_queue(Queue &queue,elemtype e);
void de_queue(Queue &queue,elemtype *e);
int main(){
Queue queue;
init_queue(queue);
en_queue(queue,10);
en_queue(queue,11);
en_queue(queue,12);
elemtype e;
de_queue(queue,&e);
cout<<e<<'d'<<queue.head.data<<endl;
de_queue(queue,&e);
cout<<e<<'d'<<queue.head.data<<endl;
de_queue(queue,&e);
cout<<e<<'d'<<queue.head.data<<endl;
en_queue(queue,13);
de_queue(queue,&e);
cout<<e<<'d'<<queue.head.data<<endl;
return 0;
}
void init_queue(Queue &queue){
queue.head.data=0;
queue.head.next = NULL;
queue.tail= &queue.head;
}
void en_queue(Queue &queue,elemtype e){
link_node p;
p = new node;
if(!p) exit(OVERFLOW);
p->data = e;
p->next = NULL;
queue.tail->next= p;
queue.tail = p;
queue.head.data++;
}
void de_queue(Queue &queue,elemtype *e){
if(queue.head.data == 0) return ;
link_node p=queue.head.next;
*e=p->data;
queue.head.next = p->next;
delete p;
queue.head.data--;
if(queue.head.data == 0) queue.tail = &queue.head ;
}
传送门
if (!S.base)exit(OVERFLOW)是什么意思
深入掌握栈的三种类型初始化