1.栈的顺序存储结构
栈是一种先进后出的特殊线性表,对栈的顺序结构的编写,实际上和线性表的顺序结构差不多。掌握了线性表,也就掌握了栈。下面是顺序结构的代码。
//栈是限定在仅在表尾进行插入和删除的线性表
//又被称为后进先出的线性表,是表的一种特殊形式(LIFO)
#include<stdio.h>
#define error 0
#define ok 1
#define maxsize 30
//栈的数据结构
typedef struct Sqstack{
int data[maxsize];
int top;
}Sqstack;
//创建一个栈
int bulid_stack(Sqstack *p,int n){
p->top=-1; //栈的初始化
for(int i=0;i<n;i++){
printf("p->data[%d]=",i);
scanf("%d",&p->data[i]);
p->top++;
}
printf("p->top=%d\n",p->top);
return ok;
}
//打印栈内的元素
int print_stack(Sqstack *p,int n){
for(int i=n-1;i>-1;i--){
printf("p->data[%d]=%d\n",i,p->data[i]);
}
printf("p->top=%d\n",p->top);
printf("\n");
return ok;
}
//插入元素
int push_stack(Sqstack *p,int e){
if(p->top==maxsize){
printf("栈满!\n");
return error;
}
p->top++;
p->data[p->top]=e;
print_stack(p,p->top+1);
return ok;
}
//出栈
int pop_stack(Sqstack *p){
int e;
if(p->top==-1){
printf("栈空!\n");
return error;
}
e=p->data[p->top];
printf("出栈的值为:e=%d",e);
printf("\n");
p->top--;
print_stack(p,p->top+1);
return ok;
}
//访问值
int get_stack(Sqstack *p,int i){
return p->data[i-1];
}
//修改值
int xiugai_stack(Sqstack *p,int i,int e){
int dee;
p->data[i-1]=e;
print_stack(p,p->top+1);
printf("\n");
return ok;
}
int main(){
Sqstack s;
int k;
printf("建立k个元素的栈!\n");
printf("k=");
scanf("%d",&k);
bulid_stack(&s,k);
printf("---------------------------------1.输出栈元素----------------------------------\n");
printf("---------------------------------2.进栈----------------------------------------\n");
printf("---------------------------------3.出栈----------------------------------------\n");
printf("---------------------------------4.访问值--------------------------------------\n");
printf("---------------------------------5.修改----------------------------------------\n");
while(1){
int j;
printf("选择序号为:j=");
scanf("%d",&j);
switch(j){
case 1:{
print_stack(&s,k);
break;
}
case 2:{
int kee;
printf("进栈的元素为:");
scanf("%d",&kee);
push_stack(&s,kee);
break;
}
case 3:{
pop_stack(&s);
break;
}
case 4:{
int i;
printf("取数的位置为:");
scanf("%d",&i);
printf("取出的数为:%d\n",get_stack(&s,i));
printf("\n");
break;
}
case 5:{
int i,j;
printf("修改的位置为:");
scanf("%d",&i);
printf("修改的数为:");
scanf("%d",&j);
xiugai_stack(&s,i,j);
break;
}
}
}
return 0;
}
2.相对于栈的顺序结构,栈的链式存储结构(也成链栈)有点难。基本思想就是把栈的栈顶元素当做链表的头指针来进行数据的操作,对于链栈是不需要头结点的,因此在建立链表时要编写不带头结点的链表。
主要代码为:
//栈的链式结构
#include<stdio.h>
#include<stdlib.h>//malloc()和free()函数的头函数
#define error 0
#define ok 1
typedef struct Nodestack{
int data;
struct Nodestack *next;
}Nodestack,*Nodeofstack;//结点数据结构
typedef struct Linkstack{
int count;
Nodeofstack top;//相当于头指针
}Linkstack;//栈的数据结构
//建立链栈(头插法)
int bulid_lian_stack(Linkstack *p){
Nodeofstack s;
int n;
printf("建立n个元素的链表。\n");
printf("n=");
scanf("%d",&n);
p->count=0;
p->top=NULL;
for(int i=0;i<n;i++){
s=(Nodeofstack)malloc(sizeof(Nodestack));
printf("第%d个元素的值为:",i+1);
scanf("%d",&s->data);
s->next=p->top;
p->top=s;
p->count++;
}
return ok;
}
//打印链栈
int print_lian_stack(Linkstack *p){
int s;
for(s=p->count;s>0;s--){
printf("第%d个元素的值为:%d\n",s,p->top->data);
p->top=p->top->next;
}
printf("\n");
return ok;
}
//插入链栈
int insert_lian_stack(Linkstack *p,int e){
Nodeofstack s;
s=(Nodeofstack)malloc(sizeof(Nodestack));
s->data=e;
s->next=p->top;
p->top=s;
p->count++;
print_lian_stack(p);
return ok;
}
//删除链栈
int delete_lian_stack(Linkstack *p){
Nodeofstack s;
printf("删除的元素为:%d\n",p->top->data);
s=p->top;
p->top=s->next;
free(s);
p->count--;
print_lian_stack(p);
return ok;
}
//主函数
int main(){
Linkstack L;
bulid_lian_stack(&L);
printf("-----------------------------------1.打印链栈-----------------------------------\n");
printf("-----------------------------------2.插入---------------------------------------\n");
printf("-----------------------------------3.删除---------------------------------------\n");
while(1){
int pp;
printf("选择序号为:");
scanf("%d",&pp);
switch(pp){
case 1:{
print_lian_stack(&L);
break;
}
case 2:{
int e;
printf("插入的元素是:");
scanf("%d",&e);
insert_lian_stack(&L,e);
break;
}
case 3:{
delete_lian_stack(&L);
break;
}
}
}
return 0;
}