溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點(diǎn)擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

數(shù)據(jù)結(jié)構(gòu)-stack的基本操作

發(fā)布時間:2020-06-11 14:34:39 來源:網(wǎng)絡(luò) 閱讀:1253 作者: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;          //記錄棧元素個數(shù)
}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)
{       //構(gòu)造一個空棧
        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;	//棧空間擴(kuò)容
	}
	*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;
*/
/*
//需求:將一個十進(jìn)制轉(zhuǎn)換為二進(jìn)制
		void conversion();
		conversion();
		//cout<<"棧長度為:"<<StackLength(sta)<<endl;
*/


//需求:行編程程序
	/*
		void LineEdit();
		LineEdit();
	*/
//需求:后綴表達(dá)式求值 3 4 + 5 * 7 / 

		char str[100];
		fgets(str,100,stdin);		//從標(biāo)準(zhǔn) 輸入獲取字符串
		int res=0;
		int ReverseCal(char *);		//函數(shù)聲明
		res=ReverseCal(str);		//函數(shù)調(diào)用

		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)
{	//將中綴表達(dá)式轉(zhuǎn)換為后綴表達(dá)式
	SqStack OPTR;		//操作符棧
	SqStack OPND;		//操作數(shù)棧

	InitStack(OPTR);
	InitStack(OPND);


	Push(OPTR,'#');
	char *p=s;
	while(*p!='\0')
	{
		switch(*p)
		{
			//如果不是運(yùn)算符(是數(shù)字),入棧
			//如果是運(yùn)算符,比較符合棧的操作符,再做
		}
		p++;
	}

	return s;
}

int ReverseCal(char *s)
{	//逆波蘭式計算器
	SqStack sta;
	InitStack(sta);					//初始化話一個棧結(jié)構(gòu)
	int res;
	int a,b;
	char *p=s;
	p=strtok(s," ");				//分解字符串
	Push(sta,atoi(p));				//atoi()函數(shù)將字符串轉(zhuǎn)換為int
	while( (p=strtok(NULL," ")) !='\0')
	{
		switch(*p)
		{
		case '+':
			Pop(sta,b);
			Pop(sta,a);
			res = a+b;			
			Push(sta,res);			//將結(jié)果入棧
			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));		//如果獲取數(shù)字直接入棧
		}
	}
	return res;
}

/*
void LineEdit()
{	//行編輯函數(shù)
	cout<<"請輸入字符:"<<endl;
	SqStack sta;
	InitStack(sta);					//初始化話一個棧結(jié)構(gòu)
	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);		//銷毀棧
}//行編輯函數(shù)

*/

void conversion()
{	//進(jìn)制轉(zhuǎn)換程序
	int N;
	cout<<"請輸入一個正整數(shù):"<<endl;
	cin>>N;
	SqStack sta;
	InitStack(sta);
	while(N!=0)
	{
		Push(sta,N%2);		//求余
		N=N/2;				//整除
	}
	//StackTraverse(sta);
	cout<<"對應(yīng)的二進(jìn)制為:"<<endl;
	while(IsEmpty(sta)!=1)
	{
		SElemType e;
		Pop(sta,e);
		cout<<e<<" ";
	}
	cout<<endl;
}





向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI