栈的基础
压栈(push),入栈都是往栈顶top添加元素,top指针网上移。
出栈(pop),从栈中删除元素,top指针往下移。
栈是只能在端点top处进行插入和删除的线性表.
顺序栈
链栈
链表的头指针就是栈顶,不需要头结点。
栈的基本操作
1.定义结构体 2.创建栈 3.显示 4.入栈 5.出栈
1.定义结构体
//结构体的创建
#include<stdio.h>
#include<stdlib.h>
#include<malloc.h>
#define STACKSIZE 100
#define STACKINCREMENT 10
//顺序栈
typedef struct Stack{
int* top;
int* base;
int stacksize;
}Stack;
//线性栈
typedef struct SNode{
int data;
struct SNode* next;
}SNode,*Linkstack;
Linklist top,base;//创建全局变量
2.创建栈
//顺序栈
int create(Stack &S, int n){
S.base = (int*)malloc(STACKSIZE*sizeof(int));
if(!base) return 0;
S.top = S.base;
S.stacksize = STACKSIZE;
printf("请输入栈顶元素\n");//top指针在栈顶元素之上
for(int i = 1;i<=n;i++){
scanf("%d",&*S.top);
S.top++;//top指针在栈顶元素之上
}
}
//链式栈
void create(int n){
Linklist p;
base = top;//初始化栈
printf("输入栈的元素:\n");
int x;
for(int i=1;i<=n;i++)
{
scanf("%d",&x);
p=(LinkStack)malloc(sizeof(SNode));//创建一个节点用于头插法
p->data=x;
p->next=top;
top=p;
}
}
3.栈的显示
//顺序栈
int show(Stack S){
if(S.top == S.base){
printf("空栈\n"); return 0;
}
int *p;//创建指针变量用于遍历
p = S.top;
while(p>S.base){
p--; printf("%d",*p);
}
printf("\n");
}
//链式栈
int show(){
LinkStack p;//用于遍历
printf("当前链栈元素为:");
p=top;
if(p==base){
printf("栈为空\n");
return 0;
}
while(p!=NULL){
printf("%d ",p->data);
p=p->next;
}
printf("\n");
}
4.入栈push
//顺序栈
int Push(SqStack &S, int e){
if (S.top-S.base>=S.stacksize){
S.base=(int *)realloc(S.base,(S.stacksize+STACKINCREMENT)*sizeof(int));
if (!S.base) return 0;
S.top=S.base+S.stacksize;
S.stacksize+=STACKINCREMENT;
}
*S.top++=e;
}
//链式栈
int Push(int e){
LinkStack p;
p=(LinkStack)malloc(sizeof(SNode));
p->data=e;
p->next=top;
top=p;
}
5.出栈pop
//顺序栈
int Pop(SqStack &S){
int e;
if (S.top==S.base) return 0;
e=*--S.top;
printf("出栈元素为%d\n",e);
}
}
//链式栈
int Pop(){
LinkStack p;
int e;
if(top==base) return 0;
p=top;
e=p->data;
top=top->next;
free(p);
}
以上是个人总结,欢迎批评指正。