数据结构:堆栈

栈的顺序存储实现

  • 包含:存数据的数组,栈顶“指针”(存放栈顶的位置,是数组下标)0-maxsize-1
    最大容量 maxsize
  • 操作:push 入栈 pop出栈
//栈的顺序存储实现==顺序栈 
/*操作:isempty,isfull,push,top,pop,CreatStack*/ 
/*因为c没有bool类型,所以凡是涉及到布尔的操作,都用int啦*/
#include<stdio.h>
#include<stdlib.h>
typedef struct SNode* Stack;
struct SNode
{
	int *data;//ElementType 为int;data为存放数据的数组 
 	int top;// ElementType 为int
	int MaxSize;
};

Stack CreatStack(int maxsize)
{
	Stack s=(Stack)malloc(sizeof(struct SNode));
	s->data=(int*)malloc(maxsize*sizeof(int));
	s->top=-1;
	s->MaxSize=maxsize;
	return s;
}

int isfull(Stack s)
{
	if(s->top+1==s->MaxSize) return 1;
	else return 0;
}
int isempty(Stack s)
{
	if(s->top==-1) return 1;
	else return 0;
}

Stack push(Stack s,int x)
{
	s->data[++s->top]=x;
	return s;
}
int pop(Stack s)//弹出并取得值 
{
	if(!isempty(s)) return s->data[s->top--];
	else printf("false");
}
int top(Stack s)
{
	if(!isempty(s)) return s->data[s->top];
	else printf("false");
}

int main()//test
{
	int maxsize=100;
	int tmp;
	Stack s=CreatStack(maxsize);
	printf("please enter stack until -1\n");
	while(1)
	{
		scanf("%d",&tmp);
		if(tmp==-1) break;
		else push(s,tmp);
	}
	printf("%d ",pop(s));
	printf("%d ",pop(s));
	printf("%d ",pop(s));
}

栈的链表存储实现

- 注意:链表存储实现中入栈位置位于链表头部,顺序存储实现中在数组末尾push
结点组成:data;next指针域
操作实现:在链表的表头插入来实现push,删除表顶端元素实现pop,top操作只是返回表顶端元素,空栈时只有一个头节点。

//链栈  struct 为数据域+指针域
//对比:顺序栈 struct为数据数组,栈顶指针top,最大容量  顺序栈的容量可以不定 
#include<stdio.h>
#include<stdlib.h>
typedef struct SNode *Stack;
struct SNode{
	int data;
	Stack next;
};

Stack CreatStack()//带头结点 
{
	Stack s=(Stack)malloc(sizeof(struct SNode));
	s->next=NULL;
	return s;
}

int isempty(Stack s)
{
	if(s->next==NULL) return 1;
	else return 0;
}

Stack push(Stack s,int x)//头插 
{
	Stack tmp=malloc(sizeof(struct SNode));
	tmp->data=x;
	tmp->next=s->next;
	s->next=tmp;
	return s;
}

int pop(Stack s)
{
	int x;
	Stack tmp;
	if(isempty(s)) printf("false");
	else
	{
		tmp=s->next;
		x=tmp->data;
		s->next=tmp->next;
		free(tmp);
		return x;
	}
}

int main()//test
{
	int tmp;
	Stack s=CreatStack();
	printf("please enter stack until -1\n");
	while(1)
	{
		scanf("%d",&tmp);
		if(tmp==-1) break;
		else push(s,tmp);
	}
	printf("%d ",pop(s));
	printf("%d ",pop(s));
	printf("%d ",pop(s));
}

c++STL库 stack操作集

头文件 #include

构造 stack s;

s.empty() 堆栈为空则返回真
s.pop() 移除栈顶元素
s.push() 在栈顶增加元素
s.size() 返回栈中元素数目
s.top() 返回栈顶元素

发布了46 篇原创文章 · 获赞 13 · 访问量 3692

猜你喜欢

转载自blog.csdn.net/qq_39679772/article/details/103639855