C语言数据结构代码练习day9
栈
后进先出,有栈顶、栈底、栈首。
顺序栈
顺序栈和顺序表差不多,除了用数组存放栈区的数据外要定义一个栈顶指针,入栈和出栈操作就是移动栈顶指针和数组数据修改。注意顺序栈的出栈并没有将内存中的数据真正删除,而是在栈看来逻辑删除了。
#include <stdio.h>
#include <stdlib.h>
typedef struct LNode{ //定义栈数据结构
int data[10]; //栈数据
int top=-1; //栈顶指针(数组下标,初始化为-1)
}SqStack; //定义栈
/*进栈*/
bool Push(SqStack &S,int x){
if(S.top==9)
return false; //栈满
S.top=S.top+1; //栈顶指针移动
S.data[S.top]=x; //数据入栈
return true; //入栈成功
}
/*出栈*/
bool Pop(SqStack &S,int &x){
if(S.top==-1)
return false; //栈空
x=S.data[S.top];
S.top=S.top-1; //逻辑删除,数据仍然保留在内存中
return true;
}
链栈
链栈和单链表类似,头指针设为栈顶指针,入栈视为单链表的头插,出栈视为单链表删除头指针指向的结点。
#include<stdio.h>
#include<stdlib.h>
typedef struct LinkNode{ //定义栈数据结构
int data; //栈数据
struct LinkNode *Next; //链栈指针
}*LinkStack; //定义链栈指针
/*链栈入栈*/
LinkStack Push(LinkStack &top,int x){
top=(LinkStack)malloc(sizeof(LinkNode));
LinkStack p;
p->Next=top->Next;
p->data=x;
top->Next=p;
return top;
}
/*链栈出栈*/
LinkStack Pop(LinkStack &top,int &x){
top=(LinkStack)malloc(sizeof(LinkNode));
LinkStack p;
p=top->Next;
x=p->data;
top->Next=p->Next;
free(p);
return top;
}