数据结构-stack的基本操作

包括三个文件: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;
}
时间: 2024-10-05 13:25:11

数据结构-stack的基本操作的相关文章

C++与数据结构 -- stack实现表达式求值[注释版]

有好多朋友评论以前的那篇博文说:代码中间没有注释.由于课程一直比较紧张,所以答应的注释直到今天才写, 发表出来,与大家共享! #include <map> #include <stack> #include <string> #include <iostream> #include <fstream> using namespace std; //为+,-,*,/运算符 设定优先级 map<char,int> priority; vo

Redis数据结构之sds基本操作函数

本文及后续文章,Redis版本均是v3.2.8 本篇文章讲解sds基本操作函数,我们从源码角度来进一步理解. 一.sds创建函数和销毁 sds创建函数 /* Create a new sds string with the content specified by the 'init' pointer * and 'initlen'. * If NULL is used for 'init' the string is initialized with zero bytes. * * The s

USTC OJ — 1004 Block world (数据结构stack,简单题)

1. 题目描述 本题描述了一个“机器人”的世界,初始状态如下所示: 现实世界中,机器人没有自主思想,只能接受指令去完成工作.类似地,题目中定义了下面的几种指令: 问题:给定一系列操作指令,计算出“机器人”在完成这些指令之后,“机器人”世界(即Block world)的状态.注意:指令操作结束是使用quit指令来完成. 2. 算法设计 问题很简单,显然需要用stack数据结构表示. 然后只需要把上面的指令描述清楚,模拟各个指令的操作设计出5个API来完成这5个指令即可. 简单地把上面五种机器人指令

数据结构--stack 基于双向链表实现(超简单版)

1 package cn.it.struct; 2 3 public class MyStack<T> { 4 private int top=-1; 5 6 private Node<T> current; 7 8 9 private class Node<T>{ 10 private T data; 11 12 private Node<T> next; 13 14 private Node<T> pre; 15 16 } 17 18 //初

数据结构-----堆的基本操作和应用

(一)用仿函数实现大堆小堆 堆数据结构是一种数组对象,它可以被视为一棵完全二叉树结构. 堆结构的二叉树存储是 最大堆:每个父节点的都大于孩子节点. 最小堆:每个父节点的都小于孩子节点. 仿函数(functor),就是使一个类的使用看上去象一个函数.其实现就是类中实现一个operator(),这个类就有了类似函数的行为,就是一个仿函数类了.在实现大,小堆的过程中,有些功能的的代码,会在不同的成员函数中用到,想复用这些代码,有两种途径. 1)公共的函数,这是一个解决方法,不过函数用到的一些变量,就可

数据结构--栈的基本操作及应用(数制转换)

#include <stdio.h> #include <stdlib.h> #include <malloc.h> #include <math.h> #define TRUE 1 #define FALSE 0 #define ERROR 0 #define INFEASIBLE -1 typedef int Status; typedef int Boolean; typedef int SElemType; #define STACK_INIT_SI

STL --&gt; stack栈

stack栈 c++stack(堆栈)是一个容器的改编,它实现了一个先进后出的数据结构(FILO) 使用该容器时需要包含#include<stack>头文件: 定义stack对象的示例代码如下: stack<int>s1; stack<string>s2; stack的基本操作有: 1 s.empty() 如果栈为空返回true,否则返回false 2 s.size() 返回栈中元素的个数 3 s.pop() 删除栈顶元素但不返回其值 4 s.top() 返回栈顶的元素

数据结构和算法 (二)数据结构基础、线性表、栈和队列、数组和字符串

Java面试宝典之数据结构基础 —— 线性表篇 一.数据结构概念 用我的理解,数据结构包含数据和结构,通俗一点就是将数据按照一定的结构组合起来,不同的组合方式会有不同的效率,使用不同的场景,如此而已.比 如我们最常用的数组,就是一种数据结构,有独特的承载数据的方式,按顺序排列,其特点就是你可以根据下标快速查找元素,但是因为在数组中插入和删除元素会 有其它元素较大幅度的便宜,所以会带来较多的消耗,所以因为这种特点,使得数组适合:查询比较频繁,增.删比较少的情况,这就是数据结构的概念.数据结构 包括

Stack的三种含义【转】

学习编程的时候,经常会看到stack这个词,它的中文名字叫做"栈". 理解这个概念,对于理解程序的运行至关重要.容易混淆的是,这个词其实有三种含义,适用于不同的场合,必须加以区分. 含义一:数据结构 stack的第一种含义是一组数据的存放方式,特点为LIFO,即后进先出(Last in, first out). 在这种数据结构中,数据像积木那样一层层堆起来,后面加入的数据就放在最上层.使用的时候,最上层的数据第一个被用掉,这就叫做"后进先出". 与这种结构配套的,是