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

#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_SIZE 10
#define STACK_INCREMENT 2

struct SqStack
{
     SElemType *base;
     SElemType *top;
     SElemType stacksize;
};

void InitStack(SqStack &S){
    if(!(S.base=(SElemType *)malloc(STACK_INIT_SIZE*sizeof(SElemType))))
        exit(OVERFLOW); // 存储分配失败
    S.top=S.base;
    S.stacksize=STACK_INIT_SIZE;

}

void DestroyStack(SqStack &S){
      free(S.base);
      S.base =NULL;
      S.top=NULL;
      S. stacksize=0;
}

void ClearStack(SqStack &S){
    S.top=S.base;
}

Status StackEmpty(SqStack S){
          if (S.top ==S.base)
              return TRUE;
          else
              return FALSE;
}

int StackLength(SqStack S){
           return S.top-S.base;
}

Status GetTop(SqStack S,SElemType &e){
     if (S.top>S.base)
     {
         e=*(S.top-1);
         return OK;
     }
     else
         return ERROR;

}

void Push(SqStack &S,SElemType e){

      if (S.top-S.base>=S.stacksize)
      {
           S.base=(SElemType *)realloc(S.base,(S.stacksize+STACK_INCREMENT)*sizeof(SElemType));
           if (!S.base) exit(OVERFLOW);
           S.top=S.base+S.stacksize;
           S.stacksize+=STACK_INCREMENT;

      }
      *(S.top)++=e;

}

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

}

void StackTraverse(SqStack S,void(*visit)(SElemType))
{ // 从栈底到栈顶依次对栈中每个元素调用函数visit()
    while(S.top>S.base)
        visit(*S.base++);
    printf("\n");
}

void print(SElemType c)
{
    printf("%d ",c);
}

void main()
{
    int j;
    SqStack s;
    SElemType e;
    InitStack(s);
    for(j=1;j<=12;j++)
        Push(s,j);
    printf("栈中元素依次为:");
    StackTraverse(s,print);
    Pop(s,e);
    printf("弹出的栈顶元素 e=%d\n",e);
    printf("栈空否:%d(1:空 0:否)\n",StackEmpty(s));
    GetTop(s,e);
    printf("栈顶元素 e=%d 栈的长度为%d\n",e,StackLength(s));
    ClearStack(s);
    printf("清空栈后,栈空否:%d(1:空 0:否)\n",StackEmpty(s));
    DestroyStack(s);
    printf("销毁栈后,s.top=%u s.base=%u s.stacksize=%d\n",s.top,s.base, s.stacksize);

    //数值转换
    printf("\n\n**********************数制转换*****************************\n\n");
    SqStack Num;
    InitStack(Num);
    int N;
    printf("请输入N:\n");
    scanf("%d",&N);
    while (N)
    {
        Push(Num,N%8);
        N=N/8;
    }
    while(!StackEmpty(Num)){
         Pop(Num,e);
         printf("%d",e);
    }
} printf("\n");

时间: 2024-08-25 00:08:17

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

7、蛤蟆的数据结构笔记之七栈的应用之数制转换

7.蛤蟆的数据结构笔记之七栈的应用之数制转换 本篇名言:"人生意义的大小,不在乎外界的变迁,而在乎内心的经验." 上面两篇中我们实现了链栈和链队列,接下去哦我们看看实际中栈的应用场景.本次来看下栈在数制转换的作用. 欢迎转载,转载请标明出处: 1.  原理介绍 十进制N和其他进制数的转换时计算机实现计算的基本问题.简单算法如下: N=(N div d )x d + N modd 2.  实现 2.1         定义结构体 定义堆栈的结构体 typedef struct { int

数据结构实践——数制转换(栈)

本文是针对数据结构基础系列网络课程(3):栈和队列的实现项目. [项目 - 数制转换] 把十进制的整数转换为任一进制数输出.请利用栈设计算法,并实现程序. 提示:要转换为r进制,则原来的数逐次除以基数r(除完之后用商再除),直到商为0,得到的一系列余数的逆序就是转换结果.这里的"逆序",意味着后产生的余数,会先输出,后进先出,栈的机会来了-- [参考解答] 解法:头文件sqstack.h请见[顺序栈算法库],使用链栈也可以. #include <stdio.h> #incl

【数据结构】用C++编写栈及基本操作(包括入栈,出栈,获得栈顶,摧毁,清空等等)

//[数据结构]用C++编写栈及基本操作(包括入栈,出栈,获得栈顶,摧毁,清空等等) //头文件 #ifndef _SEQ_STACK_ #define _SEQ_STACK_ #include <iostream> using namespace std; template <class Type> class SeqStack { public: SeqStack(size_t sz=INIT_SIZE) { capacity = sz > INIT_SIZE ? sz

数据结构实验之栈二:一般算术表达式转换成后缀式

数据结构实验之栈二:一般算术表达式转换成后缀式 Time Limit: 1000ms   Memory limit: 65536K  有疑问?点这里^_^ 题目描述 对于一个基于二元运算符的算术表达式,转换为对应的后缀式,并输出之. 输入 输入一个算术表达式,以'#'字符作为结束标志. 输出 输出该表达式转换所得到的后缀式. 示例输入 a*b+(c-d/e)*f# 示例输出 ab*cde/-f*+ 提示 来源 示例程序 由一般是求后缀式: 1.设立暂时存放运算符的栈: 2.设表达式的结束符为"#

java使用链栈实现数制转换

java实现链栈在前面有所介绍:http://www.cnblogs.com/lixiaolun/p/4644141.html 将前面java实现链栈的代码稍作修改: package linkedstack; public class LinkStack { private Element base; private Element top; class Element { public Object data; public Element next; } /** * 初始化栈 * */ pu

SDUT-3335_数据结构实验之栈与队列八:栈的基本操作

数据结构实验之栈与队列八:栈的基本操作 Time Limit: 1000 ms Memory Limit: 65536 KiB Problem Description 堆栈是一种基本的数据结构.堆栈具有两种基本操作方式,push 和 pop.push一个值会将其压入栈顶,而 pop 则会将栈顶的值弹出.现在我们就来验证一下堆栈的使用. Input 首先输入整数t(1 <= t <= 10),代表测试的组数,以后是 t 组输入. 对于每组测试数据,第一行输入两个正整数 m(1 <= m &

数据结构栈及其用法(C语言实现)

一.栈的定义 栈是限定仅在表尾进行插入或删除操作的线性表.一次对栈来说,表尾端有其特殊的含义,称为栈顶,相应 的,表头端成为栈底.不含元素的空表称为空栈.向一个栈插入新元素又称作进栈.入栈或压栈,它是把新元素放到栈顶元素的上面,使之成为新的栈顶元素:从一个栈删除元素又称作出栈或退栈,它是把栈顶元素删除掉,使其相邻的元素成为新的栈顶元素. 二.栈的特点 栈作为一种数据结构,是一种只能在一端进行插入和删除操作的特殊线性表.它按照先进后出的原则存储数据 ,先进入的数据被压入栈底,最后的数据在栈顶,需要

数据结构---栈及四则运算实现

假设我们要求输入类似这样一个表达式:9+(3-1)*3+10/2,输出结果.我们知道先括号,再乘除,最后加减,中学时候使用的科学计算器,是允许输入这样的表达式计算结果的,那么计算机怎么知道这个串里面先算括号再算乘除呢?我们先来介绍下栈这种数据结构,再来解决这个问题. 前面已经说过数组的连表,现在来说另外一种线性表的数据结构---栈. 举个比较形象的例子,洗盘子的时候,是不是一个一个往上面堆着放,拿的时候也从上面一个一个的拿,最先放的在最下面,最后放的在最上面,拿的时候第一个拿到.这就是典型的栈结

数据结构-栈的实现之运算式求值

运算时求值核心思想:将运算式逐字符读取,若是运算数就进运算数栈,若是运算符就与运算符栈顶比较运算符的优先级来做相应的操作.直到遇到运算式的结束符且运算符栈里没有运算符为止. 因为用到了两个栈(运算符栈和运算数栈)且这两个栈的基本存储类型还不一样,一个为char类型存储运算符,而另一个为float类型存储数值的.所以就调用了两个栈的头文件Stack_Float.h和Stack_Char.h.两个头文件实现的基本操作是一样的,只是里面的结构体类型进行了改动.如下: 1 /*Stack_Char.h*