淘先锋技术网

首页 1 2 3 4 5 6 7

一、特点

1. 栈——的特点是 “先进后出”;

像火车的进出站一样:

在这里插入图片描述
在这里插入图片描述

二、栈种类顺序栈和链栈

顺序栈:

初始化:
typedef struct zhan
{
	int *top;
	int *end;
	int maxsize;
}jian;

入栈:

void chuangjian()
{
	
	int x,n;
	int *p;
	L.top=(int* )malloc(L.maxsize* sizeof(int)); //为int类型的申请的空间 
	//S.base =new SElemType[MAXSIZE];也可用c++申请空间的方法申请空间(了解一下malloc和new的区别) 
	printf("输入栈的最大的空间\n");
	scanf("%d",&L.maxsize);
	L.end = L.top;
	printf("输入数据\n");
	while((L.top-L.end)<L.maxsize)
	{
		scanf("%d",&x);
		*L.top=x;
		L.top++;
	}
 } 

打印:

void shuchu()
 {
 	int *p;
 	p=L.end;
	while(p!=L.top)
	{
		printf("%d ",*p);
		p++;
	}
	
 }

出栈:

void shanchu()
 {
 	int n;
 	printf("输出需要删除的数量\n");
	scanf("%d",&n); 
	for(;n>=1&&(L.top!=L.end);n--)
	{
		L.top--;
	}
	shuchu();
 }

完整代码:

#include<stdio.h>
#include<stdlib.h>
typedef struct zhan
{
	int *top;
	int *end;
	int maxsize;
}jian;

 jian L;

void chuangjian()
{
	
	int x,n;
	int *p;
	L.top=(int* )malloc(L.maxsize* sizeof(int)); //为int类型的申请的空间 
	//S.base =new SElemType[MAXSIZE];也可用c++申请空间的方法申请空间(了解一下malloc和new的区别) 
	printf("输入栈的最大的空间\n");
	scanf("%d",&L.maxsize);
	L.end = L.top;
	printf("输入数据\n");
	while((L.top-L.end)<L.maxsize)
	{
		scanf("%d",&x);
		*L.top=x;
		L.top++;
	}
 } 
 
 void shuchu()
 {
 	int *p;
 	p=L.end;
	while(p!=L.top)
	{
		printf("%d ",*p);
		p++;
	}
	
 }
 void shanchu()
 {
 	int n;
 	printf("输出需要删除的数量\n");
	scanf("%d",&n); 
	for(;n>=1&&(L.top!=L.end);n--)
	{
		L.top--;
	}
	shuchu();
 }
int main()
{
	
	chuangjian();
	shuchu();
	shanchu();
	return 0;
 } 

链栈:

初始化:

typedef struct zhan
{
	int data;
	struct zhan *next;
}zhan;

入栈:

void shuru()
{
	int n;
	zhan *p;
	//头插法建立链栈 
	L=(zhan *)malloc(sizeof(zhan));
	L->next=NULL;
	printf("需要输入数据的个数\n");
	scanf("%d\n",&n);
	for(;n>0;n--)
	{
		p=(zhan *)malloc(sizeof(zhan));
		scanf("%d",&p->data);
		p->next=L;
		L=p;
		
		//此处不能free(p)或delete p 因为p和L为同一个节点释放p即使是删除L 
		
	}
}

出栈:

void shanchu()
{
	int n;
	printf("\n");
	printf("输入需要删除的数量\n");
	scanf("%d",&n);
	
	while(n>=1&&L->next!=NULL)
	{
		
		L=L->next;
		n--;
	}
	shuchu();
}

完整代码:

#include<stdio.h>
#include<stdlib.h>
typedef struct zhan
{
	int data;
	struct zhan *next;
}zhan;

zhan *L;
void shuru()
{
	int n;
	zhan *p;
	//头插法建立链栈 
	L=(zhan *)malloc(sizeof(zhan));
	L->next=NULL;
	printf("需要输入数据的个数\n");
	scanf("%d\n",&n);
	for(;n>0;n--)
	{
		p=(zhan *)malloc(sizeof(zhan));
		scanf("%d",&p->data);
		p->next=L;
		L=p;
		
		//此处不能free(p)或delete p 因为p和L为同一个节点释放p即使是删除L 
		
	}
}
void shuchu()
{
	zhan *p;
	p=(zhan *)malloc(sizeof(zhan));
	p=L;
	while(p->next!=NULL)
	{
		printf("%d ",p->data);
		p=p->next;
	}
}
void shanchu()
{
	int n;
	printf("\n");
	printf("输入需要删除的数量\n");
	scanf("%d",&n);
	
	while(n>=1&&L->next!=NULL)
	{
		
		L=L->next;
		n--;
	}
	shuchu();
}
int  main()
{
	shuru();
	shuchu(); 
	shanchu() ;
}

 

三、常考题:

一个栈的入栈序列是 a,b,c,d,e,则栈的不可能的输出序列是( )
a) edcba
b) decba
c) dceab
d) abcde
c答案是错的 a b c d入栈然后d c 出栈 然后e入栈然后出栈接着此时a在b下一层根据先入后出,无法输出a b