栈
定义
栈是限制在一端进行插入操作和删除操作的线性表,俗称堆栈,允许进行操作的一端称为“栈顶”,另一固定端称为“栈底”,当栈中没有元素时称为“空栈”。
后进先出
栈有顺序栈和链栈两种存储结构,这两种存储结构的不同,则使得实现栈的基本运算的算法也有所不同。
顺序栈
顺序栈它是线性逻辑结构顺序存储的一种,具有和顺序表同样的存储结构,由数组定义,配合用数组下标表示的栈顶指针top完成各种上操作。
定义
typedef int datatype;
#define maxsize 64
typedef struct{
datatype data[maxsize];
int top;
}seqStack,*seqStackP;
初始化
void SetEmpty(seqStack *s){
s->top = -1;
}
Empty
bool Empty(seqStack *s){
return ((s->top >=0)?false:true);
}
进栈
seqStackP Push(seqStackP s,int x){
if (s->top==maxsize-1){
printf("over\n");
return NULL;
}else{
s->top++;
s->data[s->top]=x;
}
return s;
}
出栈
datatype Pop(seqStackP s){
if (Empty(s)){
printf("null\n");
return NULL;
}else{
return s->data[s->top--];
}
}
取栈顶
datatype Top(seqStackP s){
if (Empty(s)){
printf("null\n");
return NULL;
}else{
return s->data[s->top];
}
}
建立
void CreateStack(seqStackP s){
SetEmpty(s);
int d;
scanf("%d",&d);
while (s->top<maxsize&&d!=-1){
Push(s,d);
scanf("%d",&d);
}
}
链 栈
定义
typedef int datatype;
typedef struct node{
datatype data;
struct node *nex;
}linksatck;
空栈和初始化
void SetEmpty(linkstack* s) {
s->next = NULL;//在此是设立一个head结点,栈顶在head->next位置
}
bool isEmpty(linkstack* s) {
return s->next==NULL?true:false;
}
进栈
void push(linkstack *top,datatype x) {
linkstack * p = (linkstack*)malloc(sizeof(linkstack));
p->data = x;
p->next = top->next;
top->next = p;
return ;
}
出栈
linkstack* pop(linkstack * top,datatype* x) {
if(isEmpty(top)) {
printf("wrong!\n");
return NULL;
} else {
linkstack *p = top->next;
*x = p->data;
top->next = p->next;
free(p);
return top;
}
}
创建栈
void create(linkstack *s) {
int x;
scanf("%d",&x);
while (x!=-1) {
push(s,x);
scanf("%d",&x);
}
return ;
}
…简单操作,仅作复习使用