顺序栈是指利用顺序存储结构实现的栈。用一个数组来顺序存储栈中元素,一个整型变量top来记录当前栈顶元素在数组中的位置。
1.结点类型
#define maxlen 100
typedef struct{
Datatype data[maxlen];
int top;
}SeqStack;
2.置空栈算法
SeqStack *InitStack(SeqStack *S){
S->top=-1;
return S;
}
3.建空栈算法
SeqStack *SetStack(){
SeqStack *S;
S=(SeqStack *)malloc(sizeof(SeqStack));
S->top=-1;
return S;
}
4.判栈空算法
//栈空返回1,不空返回0
int StackEmpty(SeqStack *S){
if(S->top>=0)
return 0;
else
return 1;
}
5.判栈满算法
//栈满返回1,不满返回0
int StackFull(SeqStack *S){
if(S->top<=maxlen&&S->top>=0)
return 0;
else
return 1;
}
6.取栈顶元素算法
Datatype Gettop(SeqStack *S){
if(S->top<=maxlen&&S->top>=0)
return(S->datat[S->top]);
else
printf("Error!");
}
7.入栈算法
void Push(SeqStack *S,Datatype x){
if(S->top<maxlen-1&&S->top>=-1){
S->top++;
S->data[S->top]=x;
}
else
printf("Error!");
}
8.出栈算法
void Pop(SeqStack *S){
if(S->top>=0)
S->top--;
else
printf("Error!");
}
其中,栈顶位置 S->top
栈底元素 S->data[0]
栈底元素 S->data[S->top]
下面为实现顺序栈的基本操作
#include<stdio.h>
#include<malloc.h>
#define maxlen 100
typedef struct{
int data[maxlen];
int top;
}SeqStack;
//创建空栈并初始化
SeqStack *InitStack(){
SeqStack *S;
S=(SeqStack *)malloc(sizeof(SeqStack));
S->top=-1;
return S;
}
//判断栈满算法
int StackFull(SeqStack *S){
if(S->top<maxlen-1&&S->top>-1)
printf("此栈未满!\n");
else
printf("此栈已满!\n");
return 0;
}
//取栈顶元素算法
int GetTop(SeqStack *S){
if(S->top<maxlen-1&&S->top>=0)
return (S->data[1]);
else
printf("取栈顶元素失败!\n");
// return 0;
}
//元素入栈算法
void Push(SeqStack *S,int x){
if(S->top<maxlen-1&&S->top>=-1){
S->top++;
S->data[S->top]=x;
}
else
printf("入栈失败!\n");
}
//元素出栈算法
void Pop(SeqStack *S){
if(S->top>-1){
S->top--;
printf("此时栈顶元素是:%d\n",S->data[S->top]);
printf("栈长:%d\n",S->top+1);
}
else
printf("出栈失败!\n");
}
//操作运行
int main(){
SeqStack *S;
int x,i;
int A,len;
printf("建立一个空栈并且初始化!\n");
S=InitStack();
printf("现在建立一个空栈\n请输入栈的长度:");
scanf("%d",&len);
for(i=0;i<len;i++){
printf("输入入栈的元素:\n");
scanf("%d",&x);
Push(S,x);
printf("入栈后的栈顶元素为:%d\n",S->data[S->top]);
printf("栈长:%d\n",S->top+1);
}
printf("判断顺序栈是否为满?\n");
StackFull(S);
printf("取栈顶元素:\n");
A=GetTop(S);
printf("此时的栈顶元素是%d\n",A);
printf("元素出栈\n");
Pop(S);
return 0;
}
链栈
链栈是指采用链接存储结构实现的栈。栈中每一个元素单独占用相应大小的存储空间,每个存储存储单元在存储中元素ai的同时,也存储其逻辑后继ai+1的存储地址;所有存储单元可以占用连续或不连续的存储区域,也称每个存储单元为链栈中的结点。其中,data域是数据域,用来存放数据元素ai的值,next域是指针域,用来存放ai的直接后继ai+1的存储地址。
下面为实现顺序栈的基本操作
#include<stdio.h>
#include<malloc.h>
#define maxlen 100
typedef struct{
int data[maxlen];
int top;
}SeqStack;
//创建空栈并初始化
SeqStack *InitStack(){
SeqStack *S;
S=(SeqStack *)malloc(sizeof(SeqStack));
S->top=-1;
return S;
}
//判断栈满算法
int StackFull(SeqStack *S){
if(S->top<maxlen-1&&S->top>-1)
printf("此栈未满!\n");
else
printf("此栈已满!\n");
return 0;
}
//取栈顶元素算法
int GetTop(SeqStack *S){
if(S->top<maxlen-1&&S->top>=0)
return (S->data[1]);
else
printf("取栈顶元素失败!\n");
// return 0;
}
//元素入栈算法
void Push(SeqStack *S,int x){
if(S->top<maxlen-1&&S->top>=-1){
S->top++;
S->data[S->top]=x;
}
else
printf("入栈失败!\n");
}
//元素出栈算法
void Pop(SeqStack *S){
if(S->top>-1){
S->top--;
printf("此时栈顶元素是:%d\n",S->data[S->top]);
printf("栈长:%d\n",S->top+1);
}
else
printf("出栈失败!\n");
}
//操作运行
int main(){
SeqStack *S;
int x,i;
int A,len;
printf("建立一个空栈并且初始化!\n");
S=InitStack();
printf("现在建立一个空栈\n请输入栈的长度:");
scanf("%d",&len);
for(i=0;i<len;i++){
printf("输入入栈的元素:\n");
scanf("%d",&x);
Push(S,x);
printf("入栈后的栈顶元素为:%d\n",S->data[S->top]);
printf("栈长:%d\n",S->top+1);
}
printf("判断顺序栈是否为满?\n");
StackFull(S);
printf("取栈顶元素:\n");
A=GetTop(S);
printf("此时的栈顶元素是%d\n",A);
printf("元素出栈\n");
Pop(S);
return 0;
}
顺序队列-主要是循环队列
#include<stdio.h>
#include<malloc.h>
#define maxlen 100
typedef struct{
int data[maxlen];
int front;
int rear;
}SeqQueue;
//建立空循环队列
SeqQueue *SetQueue(){
SeqQueue *Q;
Q=(SeqQueue *)malloc(sizeof(SeqQueue));
Q->front=0;
Q->rear=0;
printf("空循环队列已建立!\n");
return Q;
}
//判队满算法
int QueueFull(SeqQueue *Q){
if(Q->front==(Q->rear+1)%maxlen)
return 1;
else
return 0;
}
//判队空算法
int QueueEmpty(SeqQueue *Q){
if(Q->front==Q->rear)
return 1;
else
return 0;
}
//入队算法
void Add(SeqQueue *S,int x){
if(!QueueFull(Q)){
Q->rear=(Q->rear+1)%maxlen;
Q->data[Q->rear]=x;
}
else
printf("Queue full!\n");
}
//出队算法
void Delete(SeqQueue *S){
if(!QueueEmpty(Q))
Q->front=(Q->front+1)%maxlen;
else
printf("Queue empty!\n");
}
运行代码如下:
#include<stdio.h>
#include<malloc.h>
#define maxlen 100
typedef struct{
int data[maxlen];
int front;
int rear;
}SeqQueue;
//建立空循环队列
SeqQueue *SetQueue(){
SeqQueue *Q;
Q=(SeqQueue *)malloc(sizeof(SeqQueue));
Q->front=0;
Q->rear=0;
printf("空循环队列已建立!\n");
return Q;
}
//判队满算法
int QueueFull(SeqQueue *Q){
if(Q->front==(Q->rear+1)%maxlen){
printf("此循环队列已满!\n");
return 1;
}
else{
printf("此循环队列未满!\n");
return 0;
}
}
//判队空算法
int QueueEmpty(SeqQueue *Q){
if(Q->front==Q->rear){
printf("此循环队列为空!\n");
return 1;
}
else{
printf("此循环队列不为空!\n");
return 0;
}
}
//入队算法
void Add(SeqQueue *Q,int x){
if(!QueueFull(Q)){
Q->rear=(Q->rear+1)%maxlen;
Q->data[Q->rear]=x;
printf("元素入队成功!\n");
}
else
printf("Queue full!\n");
}
//出队算法
void Delete(SeqQueue *Q){
if(!QueueEmpty(Q)){
Q->front=(Q->front+1)%maxlen;
printf("元素出队成功!\n");
}
else{
printf("Queue empty!\n");
}
}
int main(){
SeqQueue *S;
int len,i,x;
int s;
printf("建立一个循环队列\n");
S=SetQueue();
printf("输入队列长度:");
scanf("%d",&len);
printf("请输入需要入队的元素:\n");
for(i=1;i<=len;i++){
scanf("%d",&S->data[i]);
S->rear++;//这个一定不能忘。front和rear两个指针是判断依据!
}
scanf("%d",&x);
Add(S,x);
printf("判断循环队列是否已满?\n");
s=QueueFull(S);
printf("出队\n");
Delete(S);
return 0;
}
运行结果如图: