代码实现了栈的增删改查基本操作。
顺序栈
#include<stdio.h>
#define MAXSIZE 8
typedef int XX;
typedef struct{
XX *top;
XX *base;
int letter;
}stack;
//初始化
void makenew(stack &L){
L.letter = MAXSIZE;
L.base = new XX[MAXSIZE];
L.top = L.base;
}
//入栈,要判栈是否满
void setdata(stack &L,XX data){
if(L.top-L.base==L.letter){
printf("此时栈已满。");
return ;
}
*L.top=data;
*L.top++;
}
//出栈
XX gettop(stack &L){
if(L.base==L.top){
printf("此时栈空。");
return 0;
}
XX w;
w=*(--L.top);
return w;
}
//取栈顶元素
XX appeartop(stack &L){
if(L.base==L.top){
printf("此时栈空");
return 0;
}
return *(L.top-1);
}
//显示栈内元素
void appear(stack L){
printf("栈内元素为:\n\t");
XX *node;
node=L.base;
while(node!=L.top){
printf("%d\t",*node);
*node++;
}
printf("\n");
}
void main(){
int ruler,ii; //ruler记录元素长度,ii记录每次输入的操作数。
XX data; //入栈数据
XX atop,top; //出栈和取栈顶元素
stack L;
makenew(L);
printf("请输入您要入栈的元素的个数\n");
scanf("%d",&ruler);
printf("请输入元素:\n");
for(int i=0;i<ruler;i++){
scanf("%d",&data);
setdata(L,data);
}
appear(L);
printf("----------------------------------------------\n\n");
printf("1入栈\t2出栈\t3取栈顶元素\t4显示栈内元素,由底到顶\t其他数字为退出\n");
scanf("%d",&ii);
printf("----------------------------------------------\n\n");
while(ii){
if(ii==1){
printf("请输入您要放入的元素:\n");
scanf("%d",&data);
setdata(L,data);
}
else if(ii==2){
top=gettop(L);
printf("取出元素为%d\n",top);
}
else if(ii==3){
atop=appeartop(L);
printf("栈顶元素为%d\n",atop);
}
else if(ii==4)
appear(L);
else
break;
printf("----------------------------------------------\n\n");
printf("请输入接下来的操作数:\n");
scanf("%d",&ii);
}
}
链栈
#include<stdio.h>
#include<stdlib.h>
typedef int XX;
typedef struct Lnode{
XX data;
struct Lnode *next;
}Lnode,*linkLnode;
//入栈
void settop(linkLnode &L,XX data){
Lnode *e;
e=(Lnode *)malloc(sizeof(Lnode));
e->next = L->next;
L->next=e;
e->data=data;
}
//出栈
XX gettop(linkLnode &L){
XX w;
Lnode *p;
if(L->next==NULL){
printf("此时栈空,无元素");
return 0;}
p=L->next;
w=p->data;
L->next=L->next->next;
free(p);
return w;
}
//取栈顶元素
XX havetop(linkLnode L){
if(L->next==NULL){
printf("此时站内无元素。\n");
return 0;
}
return L->next->data;
}
//显示栈内元素
void appear(linkLnode L){
if(L->next==NULL){
printf("栈空\n");
return;}
Lnode w;
w = *L->next;
printf("站内从顶到底的元素依次为:\n\t");
while(w.next!=NULL){
printf("%d\t",w.data);
w=*w.next;
}
printf("%d\n",w.data);
}
void main(){
int ruler;
XX data;
linkLnode L;
L=(Lnode *)malloc(sizeof(Lnode));
L->next=NULL;
printf("*****************************************\n");
printf("请输入您想输入的元素个数:\n");
scanf("%d",&ruler);
printf("请输入数据元素\n");
for(int i=0;i<ruler;i++){
scanf("%d",&data);
settop(L,data);
}
printf("创建成功,");
appear(L);
printf("\n----------------------------------------");
int ii;
printf("\n1入栈\t2出栈\t3取栈顶元素\t4显示栈内元素\n\n");
printf("请输入您想要的操作数:\n");
scanf("%d",&ii);
while(ii){
if(ii==1){
printf("请输入您想入栈的元素:\n");
scanf("%d",&data);
settop(L,data);
}
else if(ii==2){
XX hh=gettop(L);
printf("取出的元素为:%d\n",hh);
}
else if(ii==3){
XX hhh=havetop(L);
printf("栈顶元素为:%d\n",hhh);
}
else if(ii==4)
appear(L);
else
break;
printf("----------------------------------------\n");
printf("请输入您想要的操作数:\n");
scanf("%d",&ii);
}
}