温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

数据结构-stack的基本操作

发布时间:2020-06-11 14:34:39 来源:网络 阅读:1234 作者:toceph 栏目:编程语言


包括三个文件:stack.h,stack.cpp,main.cpp


stack.h


#include "stdio.h"
#include <stdlib.h>
#include <malloc.h>
#include <string.h>

#define Status int
#define SElemType int
#define STACK_INIT_SIZE 100
#define STACKINCREMENT 10
#define OVERFLOW 0
#define ERROR 0
#define OK 1
//
typedef struct
{
        SElemType *base;        //指向栈尾
        SElemType *top;         //指向栈顶
        int stacksize;          //记录栈元素个数
}SqStack;
//
//
//栈的基本操作
//
//初始化栈		
Status InitStack(SqStack &S);
	//返回1,表示成功;返回0表示不成功
//判栈满
Status IsFull(SqStack &S);
//判栈空
Status IsEmpty(SqStack &S);
	//如空,返回1;非空返回0
//入栈
Status Push(SqStack &S,SElemType e);

//出栈
Status Pop(SqStack &S,SElemType &e);
//显示栈元素
Status StackTraverse(SqStack &S);
//访问栈顶
Status GetTop(SqStack &S,SElemType &e);
//求栈长度
int StackLength(SqStack &S);

//清空栈
Status ClearStack(SqStack &S);
//销毁栈
Status DestroyStack(SqStack &S);


stack.cpp



#include "stack.h"
#include "stdio.h"
#include <stdlib.h>
#include <malloc.h>
#include <iostream>
using namespace std;

//栈的基本操作
//
////初始化栈
Status InitStack(SqStack &S)
{       //构造一个空栈
        S.base =(SElemType*)malloc(STACK_INIT_SIZE * sizeof(SElemType));
        if(!S.base) return(OVERFLOW);
        S.top=S.base;
        S.stacksize=STACK_INIT_SIZE;
        return OK;
}
//判栈满
Status IsFull(SqStack &S)
{	//若满返回1,否则返回0
	if((S.top-S.base)>= S.stacksize) //若栈满
	{	//cout<<"栈满"<<endl;
		return 1;}
	else return 0;
}
//判空
Status IsEmpty(SqStack &S)
{	//若栈空返回1,否则返回0
	if(S.top==S.base) 
	{	//cout<<"栈空"<<endl;
		return 1;
	}
	else return 0;
}
//入栈
Status Push(SqStack &S,SElemType e)
{	//将e插入栈顶
	//判满,加空间
	if( IsFull(S)==1) 
	{
		S.base=(SElemType*)realloc(S.base,(S.stacksize + STACKINCREMENT)*sizeof(SElemType));
		if(S.base==NULL) return(OVERFLOW);

		S.top=S.base + S.stacksize;					//top指针移动到新位置
		S.stacksize=S.stacksize + STACKINCREMENT;	//栈空间扩容
	}
	*S.top=e;			//栈顶元素赋值
	S.top++;			//top指针上移
	//入栈
	return 0;
}
//出栈
Status Pop(SqStack &S,SElemType &e)
{	//弹出栈顶元素,并用e接收
	//判空
	if(IsEmpty(S)==1) return(ERROR);

	//弹出
	S.top--;
	e=*S.top;			//等价于e= *(--top)
	return OK;
}

//显示栈中元素
Status StackTraverse(SqStack &S)
{	//
	cout<<"遍历栈元素"<<endl;
	SElemType *p;
	p=S.base;
	while(p!=S.top)
	{
		cout<<*p<<" ";
		p++;
	}
	cout<<endl;
	cout<<"遍历完毕!"<<endl;
	return 0;
}
//取栈顶元素
Status GetTop(SqStack &S,SElemType &e)
{	//若栈空返回ERROR,否则返回1
	if(IsEmpty(S)==1) return ERROR;
	S.top--;
	e=*S.top;
	return OK;
}

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

//清空栈
Status ClearStack(SqStack &S)
{
	S.top=S.base;
	//cout<<"已清空栈"<<endl;
	return OK;
}
//销毁栈
Status DestroyStack(SqStack &S)
{
	free(S.base);
	S.top=NULL;
	S.base=NULL;
	S.stacksize=0;
	cout<<"已销毁栈"<<endl;
	return OK;
}


main.cpp



#include <iostream>
#include "stack.h"

using namespace std;


int main()
{
/*
        SqStack sta;
        InitStack(sta);

		cout<<IsEmpty(sta)<<endl;

	
		Push(sta,'a');
		Push(sta,'b');
		Push(sta,'c');
		Push(sta,'d');
		cout<<"栈长度为:"<<StackLength(sta)<<endl;
		StackTraverse(sta);
		cout<<IsEmpty(sta)<<endl;

		SElemType e;
		Pop(sta,e);
		cout<<"栈长度为:"<<StackLength(sta)<<endl;
		cout<<"e="<<e<<endl;
		StackTraverse(sta);


		GetTop(sta,e);
		cout<<"e="<<e<<endl;

		cout<<"栈长度为:"<<StackLength(sta)<<endl;

		ClearStack(sta);
		cout<<"栈长度为:"<<StackLength(sta)<<endl;


		Push(sta,'a');
		Push(sta,'b');
		Push(sta,'c');
		Push(sta,'d');

		StackTraverse(sta);
		cout<<"栈长度为:"<<StackLength(sta)<<endl;

		DestroyStack(sta);
		//cout<<"栈长度为:"<<StackLength(sta)<<endl;
*/
/*
//需求:将一个十进制转换为二进制
		void conversion();
		conversion();
		//cout<<"栈长度为:"<<StackLength(sta)<<endl;
*/


//需求:行编程程序
	/*
		void LineEdit();
		LineEdit();
	*/
//需求:后缀表达式求值 3 4 + 5 * 7 / 

		char str[100];
		fgets(str,100,stdin);		//从标准 输入获取字符串
		int res=0;
		int ReverseCal(char *);		//函数声明
		res=ReverseCal(str);		//函数调用

		cout<<"res="<<res<<endl;
		system("pause");
        return (0);
}

int Precede(char* c1,char* c2)
{   //大于返回1,小于返回-1,等于返回0 
    if(*c1=='*')
    {
      if(*c2=='+') return 1;
      if(*c2=='-') return 1;
      if(*c2=='*') return 0;
      if(*c2=='/') return 0;
    }
        if(*c1=='/')
    {
      if(*c2=='+') return 1;
      if(*c2=='-') return 1;
      if(*c2=='*') return 0;
      if(*c2=='/') return 0;
    }
            if(*c1=='+')
    {
      if(*c2=='+') return 0;
      if(*c2=='-') return 0;
      if(*c2=='*') return -1;
      if(*c2=='/') return -1;
    }
            if(*c1=='-')
    {
      if(*c2=='+') return 0;
      if(*c2=='-') return 0;
      if(*c2=='*') return -1;
      if(*c2=='/') return -1;
    }
}

char* InffixToSuffix(char *s)
{	//将中缀表达式转换为后缀表达式
	SqStack OPTR;		//操作符栈
	SqStack OPND;		//操作数栈

	InitStack(OPTR);
	InitStack(OPND);


	Push(OPTR,'#');
	char *p=s;
	while(*p!='\0')
	{
		switch(*p)
		{
			//如果不是运算符(是数字),入栈
			//如果是运算符,比较符合栈的操作符,再做
		}
		p++;
	}

	return s;
}

int ReverseCal(char *s)
{	//逆波兰式计算器
	SqStack sta;
	InitStack(sta);					//初始化话一个栈结构
	int res;
	int a,b;
	char *p=s;
	p=strtok(s," ");				//分解字符串
	Push(sta,atoi(p));				//atoi()函数将字符串转换为int
	while( (p=strtok(NULL," ")) !='\0')
	{
		switch(*p)
		{
		case '+':
			Pop(sta,b);
			Pop(sta,a);
			res = a+b;			
			Push(sta,res);			//将结果入栈
			break;
		case '-':
			Pop(sta,b);
			Pop(sta,a);
			res = a-b;
			Push(sta,res);
			break;
		case '*':
			Pop(sta,b);
			Pop(sta,a);
			res = a*b;
			Push(sta,res);
			break;
		case '/':
			Pop(sta,b);
			Pop(sta,a);
			res = a/b;
			Push(sta,res);
			break;
		default: Push(sta,atoi(p));		//如果获取数字直接入栈
		}
	}
	return res;
}

/*
void LineEdit()
{	//行编辑函数
	cout<<"请输入字符:"<<endl;
	SqStack sta;
	InitStack(sta);					//初始化话一个栈结构
	char ch,e;
	ch=getchar();
	//cout<<ch;
	while(ch!=EOF && ch!='\n')
	{
		switch(ch)
		{
		case '#': Pop(sta,e);		//若输入#,回退一格
			break;
		case '@': ClearStack(sta);	//若输入@,回退一行
			break;
		default: Push(sta,ch);
			break;
		}
		ch=getchar();
	}
	StackTraverse(sta);		//遍历栈元素
	DestroyStack(sta);		//销毁栈
}//行编辑函数

*/

void conversion()
{	//进制转换程序
	int N;
	cout<<"请输入一个正整数:"<<endl;
	cin>>N;
	SqStack sta;
	InitStack(sta);
	while(N!=0)
	{
		Push(sta,N%2);		//求余
		N=N/2;				//整除
	}
	//StackTraverse(sta);
	cout<<"对应的二进制为:"<<endl;
	while(IsEmpty(sta)!=1)
	{
		SElemType e;
		Pop(sta,e);
		cout<<e<<" ";
	}
	cout<<endl;
}





向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI