线性表-栈(四)

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;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值