数据结构-顺序栈和链栈
本文最后更新于18 天前,其中的信息可能已经过时,如有错误请发送邮件到big_fw@foxmail.com


数据结构—顺序栈和链栈

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

 

如果觉得本文对您有所帮助,可以支持下博主,一分也是缘
暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇