数据结构—顺序栈和链栈

1.顺序栈

1.顺序栈结构定义

//顺序栈结构
typedef struct{
	SElemType data[MAXSIZE];
	int top;	//用于栈顶指针 
}SqStack; 

2.入栈操作

//入栈操作 
//插入元素e为新的栈顶元素
Status Push(SqStack *S,SElemType e){
	//栈满 
	if(S->top==MAXSIZE-1){
		return ERROR;
	}
	S->top++;	//栈顶指针增加 
	S->data[S->top]=e; 	//将新元素赋值给栈顶空间
	return OK; 
} 

3.出栈操作

//出栈操作 
//若栈不空,则删除S的栈顶元素,用e返回其值,并返回OK;否则返回ERROR
Status Pop(SqStack *S,SElemType *e)
{ 
        if(S->top==-1)
                return ERROR;
        *e=S->data[S->top];	/* 将要删除的栈顶元素赋值给e */
        S->top--;				/* 栈顶指针减一 */
        return OK;
}

4.遍历栈

//遍历栈 
Status StackTraverse(SqStack S){
	int i=0;
	while(i<=S.top){
		    visit(S.data[i++]);
	}
	cout<<endl;
	return OK;
}

5.完整代码

#include<iostream>
using namespace std;

typedef int Status; 
typedef int SElemType;  //SElemType类型根据实际情况而定,这里假设为int


#define OK 1
#define ERROR 0
#define TRUE 1
#define FALSE 0
#define MAXSIZE 20 // 存储空间初始分配量

//顺序栈结构
typedef struct{
	SElemType data[MAXSIZE];
	int top;	//用于栈顶指针 
}SqStack; 


Status visit(SElemType c)
{
        cout<<c<<endl;
        return OK;
}

//构造一个空栈S
Status InitStack(SqStack *S)
{ 
        
        S->top=-1;
        return OK;
}

//把S置为空栈
Status ClearStack(SqStack *S)
{ 
        S->top=-1;
        return OK;
}

// 若栈S为空栈,则返回TRUE,否则返回FALSE
Status StackEmpty(SqStack S)
{ 
        if (S.top==-1)
                return TRUE;
        else
                return FALSE;
}

// 返回S的元素个数,即栈的长度 
int StackLength(SqStack S)
{ 
        return S.top+1;
}


//入栈操作 
//插入元素e为新的栈顶元素
Status Push(SqStack *S,SElemType e){
	//栈满 
	if(S->top==MAXSIZE-1){
		return ERROR;
	}
	S->top++;	//栈顶指针增加 
	S->data[S->top]=e; 	//将新元素赋值给栈顶空间
	return OK; 
} 

//出栈操作 
//若栈不空,则删除S的栈顶元素,用e返回其值,并返回OK;否则返回ERROR
Status Pop(SqStack *S,SElemType *e)
{ 
        if(S->top==-1)
                return ERROR;
        *e=S->data[S->top];	/* 将要删除的栈顶元素赋值给e */
        S->top--;				/* 栈顶指针减一 */
        return OK;
}

//遍历栈 
Status StackTraverse(SqStack S){
	int i=0;
	while(i<=S.top){
		    visit(S.data[i++]);
	}
	cout<<endl;
	return OK;
}


int main(){
	
    SqStack s;
    cout<<"向栈中添加元素1-5"<<endl;
	for(int i=1;i<=9;i++){
		Push(&s,i);
	} 
	StackTraverse(s);
	cout<<"添加后栈的长度:"<<StackLength(s)<<endl;
	cout<<"再向栈中压入元素99"<<endl;
	Push(&s,99);
	cout<<"遍历栈:"<<endl;
	StackTraverse(s);
	cout<<"删除栈顶元素"<<endl;
	SElemType e;
	Pop(&s,&e);
	cout<<"删除元素后遍历:"<<endl; 
    StackTraverse(s);
	    
    return 0;
} 

2.链栈

1.链栈结构定义

/*链栈结构*/
typedef struct csNode {
	datatype data;
	csNode* next;	//链域
}*chainStack;

2.入栈操作

//向链栈cs中压入一个值为x的结点
void push(chainStack cs, datatype x) {
	//创建新结点
	chainStack q = new csNode;
	q->data = x;	//给新结点赋值
	q->next = cs->next;
	cs->next = q;	//重新定义cs链域

}

3.出栈操作

//出栈
void pop(chainStack cs) {
	//判断是否为空
	if (empty(cs)) {
		return;
	}
	chainStack q = cs->next;
	cs->next = q->next;	//重新定义p的链域
	delete q;	//释放q所占用的空间
	q = NULL;
}

4.遍历栈

//遍历链栈cs
void cs_traverse(chainStack cs) {
	if (cs == NULL) {
		cout<<"栈空"<<endl;
		return;
	}
	csNode *p = cs->next;

	while (p) {
		cout << p->data << " ";
		p = p->next;
	}
	cout << endl;
}

5.完整代码

#include<iostream>
#include "math.h" 
#include "stdlib.h"  
using namespace std;


#define OK 1
#define ERROR 0
#define TRUE 1
#define FALSE 0
#define MAXSIZE 20 // 存储空间初始分配量 


typedef int datatype; //SElemType类型根据实际情况而定,这里假设为int 

/*链栈结构*/
typedef struct csNode {
	datatype data;
	csNode* next;	//链域
}*chainStack;


//初始化链栈 
int Init(chainStack& cs) {
	cs = (csNode*)malloc(sizeof(csNode));
	if (cs == NULL) {
		cout<<"申请内存失败"<<endl;
		return -1;
	}
	cs->next = NULL;
	return 1;

}


//判断栈cs是否为空栈,如果是,则返回true,否则返回false
bool empty(chainStack cs) {
	return cs->next == NULL;
}

//向链栈cs中压入一个值为x的结点
void push(chainStack cs, datatype x) {
	//创建新结点
	chainStack q = new csNode;
	q->data = x;	//给新结点赋值
	q->next = cs->next;
	cs->next = q;	//重新定义cs链域

}

//获取链栈cs的栈顶元素
datatype top(chainStack cs) {
	//判断是否为空
	if (empty(cs)) {
		return 0;
	}
	return cs->next->data;

}

//出栈
void pop(chainStack cs) {
	//判断是否为空
	if (empty(cs)) {
		return;
	}
	chainStack q = cs->next;
	cs->next = q->next;	//重新定义p的链域
	delete q;	//释放q所占用的空间
	q = NULL;
}


//遍历链栈cs
void cs_traverse(chainStack cs) {
	if (cs == NULL) {
		cout<<"栈空"<<endl;
		return;
	}
	csNode *p = cs->next;

	while (p) {
		cout << p->data << " ";
		p = p->next;
	}
	cout << endl;
}

//获取栈的长度
int chainLength(chainStack cs) {
	int len = 0;
	while (!empty(cs)) {
		len++;
		pop(cs);
	}
	return len;
}
int main() {
	chainStack s;
	Init(s);
	cout << "向栈中压入1-8元素" << endl;
	for (int i = 1; i <= 8; i++) {
		push(s, i);
	}
	cout << "压入元素后栈的长度:" << chainLength(s) << endl;
	cout << "遍历栈:" << endl;
	cs_traverse(s);

	return 0;
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值