C/C++实现栈的一些基本操作

4 篇文章 0 订阅
1 篇文章 0 订阅

顺序栈及其基本操作

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

#define STACK_INIT_SIZE 100
#define ElemType int 
/*
栈的三种有用操作
1.获取栈顶元素
2.入栈
3.出栈
*/
//Elemtype代表某一不确定类型

typedef struct
{
	int *bottom;
	int *top;
	int stackSize;
}sqStack;

/* 关于栈的一些基本操作 */
void initStack(sqStack &s);         //创造空栈
ElemType GetTop(sqStack &s);        //获取栈顶元素
bool Isempty(sqStack &s);           //是否空栈
void cleanStack(sqStack &s);        //清空栈
void destroyStack(sqStack &s);         //销毁栈
void push_stack(sqStack &s, int e);    //入栈操作
ElemType pop_stack(sqStack &s, ElemType *e);  //出栈操作
ElemType Stack_length(sqStack &s);  //栈的长度
void StackTraverse(sqStack &s);     //栈的遍历

int main()
{
	sqStack S;   
	initStack(S);  //构造一个空栈
	
	ElemType i, n;
	cout << "...输入栈的长度: ";
	cin >> n;
	/* 栈顶指针指向栈顶元素 还是 栈顶元素的上一个位置。就在下面由自己决定*/
	for (i = 1; i <= n; i++){
		printf("...输入栈的第%d个元素: ",i);
		++S.top;
		cin >> *(S.top - 1);  //这就是栈顶元素,注意是在栈顶指针的下一个内存
	}
	
	/*   判断   */
	if (Isempty(S)) {
		cout << "...不是空栈" << endl << endl;
	}
	else {
		cout << "...这确实是个空栈" << endl << endl;
	}
	
	 /*   长度   */
	int m;
	cout << "...栈的长度是: " << Stack_length(S) << endl << endl;
	
	/*   遍历   */
	cout << "...遍历栈 " << endl;
	StackTraverse(S);
	cout << endl;
     
    /*   获取栈顶元素  */
	cout << "...获取栈顶元素: " << GetTop(S) << endl << endl; 

    /*   插入  */
	int insert;
	cout << endl << "...插入元素: ";
	cin >> insert;
	push_stack(S, insert);
    cout << "...插入后...遍历栈 " << endl;
	StackTraverse(S);
	Sleep(1000);
    
    /*   删除  */
	ElemType delet;
	cout << endl << "...删除栈顶元素: " << endl;
	pop_stack(S, &delet);
	cout << "...被删除的元素是: " << delet << endl << endl;
	cout << "...删除后遍历栈 " << endl;
	StackTraverse(S);
	Sleep(1000);
    
    /*  销毁栈  */
	cout << endl << "...销毁栈的内存空间: " << endl;
	destroyStack(S);

    Sleep(1000);
	system("pause");
	return 0;
}

/**************一些函数的实现***************/
ElemType Stack_length(sqStack &s) {
	return (s.top - s.bottom);
}

void StackTraverse(sqStack &s){
	if (s.bottom == NULL){
		exit(-1);
	}
	if (s.top == s.bottom){
		cout << "...这是个空栈" << endl;
	}
	ElemType *p = s.top;
	while (p > s.bottom){   //还没到达栈底	
		--p;               //访问栈顶元素(即栈顶指针所指的下一个内存)
		cout << *p << endl;
	}
}

/*
与入栈操作相反地,出栈操作不需要进行内存的判别,
只需要先将栈顶指针下移,接着用int类型的变量e返回栈顶元素的值即可.
*/

ElemType pop_stack(sqStack &s, ElemType *e){
	if (s.top == s.bottom){
		return ERROR;
	}
	else{
		--s.top;   //通过e返回栈顶元素
		*e = *s.top; //实际上此元素并没真正删除,仍在s.top中,但是如果插入元素,就会被更新
		return *e;
	}
}

void push_stack(sqStack &s, int e){
	int incresize;
	if (s.top - s.bottom > STACK_INIT_SIZE){       //判断栈是否溢出
    cout << "...你想扩充的内存大小是: ";
	cin >> incresize;
	s.bottom = (int*)realloc(s.bottom, (s.stackSize + incresize) * sizeof(ElemType));  //在原先内存基础上再扩充increase
	s.top = s.bottom + s.stackSize;
	s.stackSize += incresize;
	}
	*(s.top++) = e;      //栈顶指针上移一位,让数据e入栈,注意顺序不能颠倒,否则栈顶指针就不熟指向栈顶元素前一位了
}

void destroyStack(sqStack &s){
	s.top = NULL;
	s.stackSize = 0;
    free(s.bottom);
	s.bottom = NULL;

	cout << "...销毁完毕" << endl;
}

void cleanStack(sqStack &s){
	s.top = s.bottom;
}

bool Isempty(sqStack &s){
	return (s.bottom != s.top);
}

ElemType GetTop(sqStack &s){
	if (s.top != s.bottom)
	{
		return *(s.top - 1);   //栈顶指针指向的下一个位置
	}
}

void initStack(sqStack &s){
	s.bottom = (ElemType*)malloc(STACK_INIT_SIZE * sizeof(ElemType));
    if (!s.bottom){
		cout << "...分配内存失败" << endl;
		exit(0);
	}
	else{
		cout << "...create successfully!" << endl << endl;
	        s.top = s.bottom;   //创造空栈
		s.stackSize = STACK_INIT_SIZE;
	}
}
	

**

实现效果如下

**


  • 3
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值