数据结构-顺序栈

一、main

#include <iostream>
#include "com.h"
using namespace std ;
/* run this program using the console pauser or add your own getch, system("pause") or input loop */

int main(int argc, char** argv) 
{
	SqStack S ;
	SElemType e ;
	int choice , n , i , number , j = 0;
	do
	{
		printf("\t\t\t==================================================\n");
		printf("\t\t\t|                                                |\n");
		printf("\t\t\t|                   顺序栈基本操作               |\n");
		printf("\t\t\t|                                                |\n");
		printf("\t\t\t|================================================|\n");
		printf("\t\t\t|                 请选择要操作的命令             |\n");
		printf("\t\t\t|------------------------------------------------|\n");
		printf("\t\t\t|                                                |\n");
		printf("\t\t\t|    0.退出整个系统          1.初始化栈          |\n");
		printf("\t\t\t|    2.初始输入元素          3.栈是否为空        |\n");
		printf("\t\t\t|    4.查看栈的长度          5.取栈顶元素        |\n");
		printf("\t\t\t|    6.入栈                  7.出栈              |\n");
		printf("\t\t\t|    8.遍历栈                9.清空栈            |\n");
		printf("\t\t\t|    10.销毁栈                                   |\n");
		printf("\t\t\t|                                                |\n");
		printf("\t\t\t==================================================\n");
		printf("选择(0---9):\t");
		cin >> choice ; 
		switch(choice)
		{
			case 0 :
				cout << "退出成功"  ;
				cout << endl ; 
				exit(0) ;
			case 1 ://  1.初始化栈 
				InitStack(S) ;
				cout << "初始化栈成功" ;
				cout << endl ; 
				break ;
			case 2 :  //2.初始输入元素 
				cout << "请输入需要入栈的数据个数:" ;
				cin >> n ;
				cout << "请输入需要入栈的"<<n<<"个数据,用空格隔开:"<<endl ;
				for(i = 1 ; i <= n ; i ++)
				{
					cin >> number ;
					Push(S , number) ;
				}
				cout << endl ;
				break ;
			case 3 :  // 3.栈是否为空 
				if(StackEmpty(S))  cout << "该栈是空栈" ;
				else  cout << "该栈不是空栈" ;
				cout << endl ;
				break ;
			case 4 :  //4.查看栈的长度 
				cout << "该栈的长度 " << StackLength(S) ;
				cout << endl ;
				break ;
			case 5 : //5.取栈顶元素  
				cout << "栈中元素为:" ; 
				if(StackTraverse(S) == ERROR)  cout << "空栈" ;
				cout << endl ;
				if(GetTop(S , e) == ERROR)  cout << "该栈为空,操作失败";
				else  cout << "栈顶元素为 " << e ;
				cout << endl ;
				break ;
			case 6 : // 6.入栈
				cout << "请输入入栈元素:" ;
				cin >> number ;
				if(Push(S , number) == ERROR)  cout << "栈已满,入栈失败" ;
				else  cout << "入栈成功" ;
				cout << endl ;
				cout << "栈中元素为:" ; 
				if(StackTraverse(S) == ERROR)  cout << "空栈" ;
				cout << endl ;
				break ;
			case 7 : // 8 出栈
				if(Pop(S , e) == ERROR)  cout << "该栈为空,操作失败" ;
				else  cout << "栈顶元素 " << e << " 已出栈" ;
				cout << endl ; 
				cout << "栈中元素为:" ; 
				if(StackTraverse(S) == ERROR)  cout << "空栈" ;
				cout << endl ;
				break ;
			case 8 : // 9遍历
				cout << "栈中元素为:" ; 
				if(StackTraverse(S) == ERROR)  cout << "空栈" ;
				cout << endl ;
				break ;
			case 9 : // 清空栈
				if(ClearStack(S) == OK)   cout << "该栈已被清空" ;
				cout << endl ;
				break ;
			case 10 : // 销毁栈
				if(DestroyStack(S) == OK)   cout << "该栈已被销毁" ;
				cout << endl ;
				break ;	 
			default :
				cout << "输入不合法,请重新输入" ;
				cout << endl ;	 
		}
	}while(choice != 0) ;
	return 0;
}

二、function

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


// 1、初始化
Status InitStack(SqStack &S)
{
//	S.base = (SElemType*)malloc(MAXSIZE*sizeof(SElemType)) ;
	S.base = new SElemType[MAXSIZE] ; 
	if(!S.base)  return OVERFLOW ;
	S.top = S.base ; 
	S.stacksize = MAXSIZE ;
	return OK ;
} 

// 判空
Status StackEmpty(SqStack S)
{
	if(S.top == S.base)  return 1 ; //空
	else  return 0 ; // 非空 
} 

//求栈长度
int StackLength(SqStack S)
{
	return S.top - S.base ;
} 

// 取栈顶
Status GetTop(SqStack S , SElemType &e)
{
	if(S.top == S.base)  return ERROR ; //空表
	e = *(S.top - 1) ;
	return OK ; 
} 

// 入栈
Status Push(SqStack &S , SElemType e)
{
	if(S.top - S.base == S.stacksize)  return ERROR ;
	*S.top = e ; // *S.top = e , S.top ++ ;*S.top ++ = e
	S.top ++ ;
	return OK ; 
} 

// 出栈
Status Pop(SqStack &S , SElemType &e)
{
	if(S.base == S.top)  return ERROR ;
	e = *--S.top ; // -- S.top , e = S.top ;
	return OK ;
}

// 遍历
Status StackTraverse(SqStack S)
{
	int i ;
	if(S.top == S.base)  return ERROR ;
	else
	{
		for(i = 0 ; i < S.top-S.base ; i ++)
			cout << S.base[i] <<" " ;
	}
	return OK ;
} 

// 清空
Status ClearStack(SqStack &S)
{
	if(S.base)  S.top = S.base ;
	return OK ;
} 

// 销毁
Status DestroyStack(SqStack &S)
{
	if(S.base)
	{
		delete S.base ;
		S.stacksize = 0 ;
		S.base = S.top = NULL ;
	}
	return OK ;
} 

三、com

// 不要用递归 !!
// 主函数里定义的变量,也是局部变量 

#ifndef _FUNC_H
#define _FUNC_H

#define OK 0
#define ERROR -1
#define OVERFLOW -2

#define MAXSIZE 100
 
typedef int Status ;
typedef int SElemType ;

typedef struct
{
	SElemType *base ;//base  就相当于 顺序表的elem
	SElemType *top ;//top是栈顶的下一个位置
	int stacksize ;
}SqStack ;

extern Status InitStack(SqStack &S) ; // 1、初始化
extern Status StackEmpty(SqStack S); // 判空
extern int StackLength(SqStack S);
extern Status GetTop(SqStack S , SElemType &e) ;
extern Status Push(SqStack &S , SElemType e);
extern Status Pop(SqStack &S , SElemType &e);
extern Status ClearStack(SqStack &S);
extern Status DestroyStack(SqStack &S);
extern Status StackTraverse(SqStack S) ;

#endif

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值