栈的练习题附加

1 进制转换

1.1 利用栈的特点,将用户输入的十进制数转换为二进制数。

#include<stdio.h>
#include<stdlib.h>
#include<malloc.h> 
#define M 100

typedef int datatype;
typedef struct{
    datatype data[M];
    int top; 
}seqstack;

void InitStack(seqstack *s){   //初始化顺序栈 
    s->top=-1;
}

int StackEmpty(seqstack *s){   //判断栈是否为空 (初始化为-1)
    if (s->top>=0) return 1;
    else return 0;
}

seqstack *push(seqstack *s,datatype x){  //元素入栈函数 
    if (s->top==M-1) return NULL;
    else 
    {   
        s->top++;  //先加再入
        s->data[s->top]=x; 
    }

     return s; 
}

datatype pop(seqstack *s){ //元素出栈函数 
    datatype x;
    x=s->data[s->top]; 
    s->top--;  
    return x; 
} 

void main(){       // 对于输入的任意一个非负十进制整数,打印输出与其等值的二进制数
    seqstack *s;
    datatype n,e; 
    int i=0,j=0;

    scanf("%u",&n);  // 输入非负十进制整数n 

    s=(struct seqstack*)malloc(sizeof(int));
    if (s==NULL) exit(0); 

    InitStack(s); // 初始化栈
    while(n) // 当n不等于0
    {
        push(s,n%2); // 入栈n除以2的余数(2进制的低位)
        i++;         // 统计入栈元素个数 
        n=n/2;
    }

    while(j<i) // 输出二进制 
    {
        j++; 
        e=pop(s); // 弹出栈顶元素且赋值给e
        printf("%d",e); 
    }

    printf("\n"); 
    system("pause"); 
}

1.2 利用栈的特点,将用户输入的十进制数转换为八进制数。


#include <stdio.h>
#include <stdlib.h>
#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define OVERFLOW -2
#define STACKINCREMENT 10
#define STACK_INIT_SIZE 100

typedef int Status;
typedef int SElemType;

typedef struct{
    SElemType *top;
    SElemType *base;
    int stacksize;
}Sqstack;

Status InitStack(Sqstack &S){
    S.base=(SElemType *)malloc(STACK_INIT_SIZE *sizeof(Sqstack));
    if(!S.base) exit(OVERFLOW);
    S.top=S.base;
    S.stacksize=STACK_INIT_SIZE;
    return OK;
}

Status Push(Sqstack &S,SElemType e){
    if(S.top-S.base>=S.stacksize) 
        S.base=(SElemType *)realloc(S.base,(STACK_INIT_SIZE+STACKINCREMENT) *sizeof(Sqstack));
    if(!S.base)  exit (OVERFLOW);
    S.stacksize+=STACKINCREMENT;
    *S.top++=e;
    return OK;
}

int Pop(Sqstack &S,SElemType &e){
    if(S.top==S.base) return ERROR;
    e=*--S.top;
    return e;
}

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

void main()
{ 
    int a,n,e,d;Sqstack S;
    InitStack(S);
    printf("请输入一个十进制整数:");
    scanf("%d",&a);
    while(a)
    {
        n=a%8 ;
        Push(S,n);
        a=a/8;
    }
    printf("该数字对应的八进制为:");
    while(!Stackempty(S))
    {
        d=Pop(S,e);
        printf("%o",d);
    }
    printf("\n");
}

1.3 利用栈的特点,将用户输入的二进制数转换为十进制数。

#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#define OK 1
#define ERROR 0
#define MAXSIZE 20

typedef int SElemType;
typedef int Status;
typedef struct 
{
    SElemType data[MAXSIZE];
    int top;    //用于栈顶指针
}Sqstack;


//顺序栈的初始化
Status InitSqstack(Sqstack * S)
{
    S->top=-1;
    return OK;
}

//进栈操作
Status Push(Sqstack * S,SElemType e)
{
    if(S->top==MAXSIZE-1)   //栈满
    {
        return ERROR;
    }
    S->top++;   //栈顶指针增加1
    S->data[S->top]=e;
    return OK;
}

//出栈操作
Status Pop(Sqstack * S,SElemType * e)
{
    if(S->top==-1)  //栈底
    {
        return ERROR;
    }
    *e=S->data[S->top];
    S->top--;
    return OK;
}

//顺序栈的建立
Status Create(Sqstack * S,int n)
{
    SElemType Number;
    for(int i=0;i<n;i++)
    {
        scanf("%d",&Number);
        Push(S,Number);
    }
    return OK;
}


//二进制转十进制
Status Change(Sqstack * S,int n)
{
    SElemType Number,result;
    SElemType Sum=0;
    for(int i=0;i<n;i++)
    {
        Pop(S,&Number);
        if(i==0)
        {
            result=Number*1;
        }
        else
        {
            for(int j=0;j<i;j++)
            Number=Number*2;
            result=Number;
        }
        Sum=result+Sum;
    }
    return Sum;
}


int main()
{
    Sqstack S;
    int ElemNumber;
    int NewElem;
    InitSqstack(&S);
    printf("请输入元素个数:\n");
    scanf("%d",&ElemNumber);
    printf("请输入二进制数:\n");
    Create(&S,ElemNumber);
    SElemType result=Change(&S,ElemNumber);
    printf("转为十进制后的结果是:\n");
    printf("%d\n",result);
    return 0;
}
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
的四则运算表达式习题是指通过的数据结构来进行四则运算的练习题。其中包括中缀表达式转后缀表达式和后缀表达式的计算。首先,中缀表达式转后缀表达式是通过使用的特点,将中缀表达式转化为等价的后缀表达式。然后,利用后缀表达式进行计算时,需要遍历表达式,按照计算方法进行计算。以下是一个完整的示例代码,用于演示的四则运算表达式习题: ```python # 定义函数,用于判断运算符的优先级 def precedence(operator): if operator == '+' or operator == '-': return 1 elif operator == '*' or operator == '/': return 2 else: return 0 # 定义函数,用于将中缀表达式转化为后缀表达式 def infix_to_postfix(expression): stack = [] postfix = '' for char in expression: if char.isdigit(): postfix += char elif char == '(': stack.append(char) elif char == ')': while stack and stack[-1 != '(': postfix += stack.pop() stack.pop() else: while stack and precedence(char) <= precedence(stack[-1]): postfix += stack.pop() stack.append(char) while stack: postfix += stack.pop() return postfix # 定义函数,用于计算后缀表达式的值 def evaluate_postfix(expression): stack = [] for char in expression: if char.isdigit(): stack.append(int(char)) else: num2 = stack.pop() num1 = stack.pop() if char == '+': stack.append(num1 + num2) elif char == '-': stack.append(num1 - num2) elif char == '*': stack.append(num1 * num2) elif char == '/': stack.append(num1 / num2) return stack.pop() # 示例表达式 infix_expression = '(3+4)*(5-2)' postfix_expression = infix_to_postfix(infix_expression) result = evaluate_postfix(postfix_expression) # 输出结果 print("中缀表达式:", infix_expression) print("后缀表达式:", postfix_expression) print("计算结果:", result) ``` 以上代码会将中缀表达式"(3+4)*(5-2)"转化为后缀表达式"34+52-*",并且计算出结果为21。这是的四则运算表达式习题的一个例子。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值