数组仿真堆栈

不仅用链表可以仿真堆栈,还可以用数组仿真堆栈。堆栈数组声明如下:

int stack[MaxSize];

int top=-1;

其中MaxSize是该堆栈的最大容量,top表示当前堆栈顶端的索引值,初始值设为-1表示堆栈为空。

数组仿真堆栈代码实现

#include<bits/stdc++.h>
#define MAXN 1000         //栈能容纳的最多元素个数
using namespace std;

int Stack [MAXN];
int top=-1;               //初始化栈顶指针为-1

int pop()                 //栈顶元素出栈并获取出栈的元素值
{
    int temp;
    if(top<0)
    {
        cout<<"\nThe stack is empty!\n";
        return -1;
    }
    temp=Stack[top--];
    return temp;
}

void push(int value)
{
    if(top>=MAXN)
        cout<<"\nThe stack is full!\n";
    else
        Stack[++top]=value;
}

void display()  //显示栈中元素
{
    for(int tmp=top; tmp>=0; --tmp)
        cout<<Stack[tmp]<<" ";
    cout<<"\n";
}

int main()
{
    int ins;
    while(1)
    {
        cout<<"Please enter a value,(0=exit,-1=top)\n";
        cin>>ins;
        if(ins==0)
            exit(0);
        else if (ins!=-1)
            push(ins);
        else if(ins ==-1)
            pop();
        display();
    }
    return 0;
}

好的,这是一个经典的问题,我来给你讲讲如何用堆栈和队列实现计算器仿真。 首先,我们需要定义一个结构体来表示计算器的操作数和操作符,可以定义如下: ```c typedef struct { int type; // 0表示操作数,1表示操作符 int value; // 操作数的值 char operator; // 操作符 } Element; ``` 然后,我们可以定义两个数组来分别表示堆栈和队列,如下: ```c Element stack[100]; int top = -1; Element queue[100]; int front = 0, rear = 0; ``` 接下来,我们需要实现入栈、出栈、入队、出队等基本操作。具体代码如下: ```c // 入栈 void push(Element e) { top++; stack[top] = e; } // 出栈 Element pop() { if (top == -1) { printf("Stack is empty!\n"); exit(0); } Element e = stack[top]; top--; return e; } // 入队 void enqueue(Element e) { queue[rear] = e; rear++; } // 出队 Element dequeue() { if (front == rear) { printf("Queue is empty!\n"); exit(0); } Element e = queue[front]; front++; return e; } ``` 接下来,我们可以实现一个函数来读取用户输入的表达式并将其转换成操作数和操作符的序列。具体代码如下: ```c void readExpression() { char input[100]; printf("Please enter an expression:\n"); scanf("%s", input); int i = 0; while (input[i] != '\0') { if (isdigit(input[i])) { // 如果是数字,将其转换成操作数 int value = input[i] - '0'; i++; while (isdigit(input[i])) { value = value * 10 + input[i] - '0'; i++; } Element e; e.type = 0; // 0表示操作数 e.value = value; enqueue(e); } else if (input[i] == '+' || input[i] == '-' || input[i] == '*' || input[i] == '/') { // 如果是操作符,直接入队 Element e; e.type = 1; // 1表示操作符 e.operator = input[i]; enqueue(e); i++; } else { // 如果是其它字符,忽略 i++; } } } ``` 最后,我们可以实现一个函数来计算表达式的值,具体代码如下: ```c int calculate() { while (front < rear) { Element e = dequeue(); if (e.type == 0) { // 如果是操作数,入栈 push(e); } else { // 如果是操作符,从栈中取出两个操作数进行计算,将结果入栈 Element e1 = pop(); Element e2 = pop(); int value; switch (e.operator) { case '+': value = e2.value + e1.value; break; case '-': value = e2.value - e1.value; break; case '*': value = e2.value * e1.value; break; case '/': value = e2.value / e1.value; break; default: printf("Invalid operator!\n"); exit(0); } Element e3; e3.type = 0; e3.value = value; push(e3); } } Element e = pop(); if (top != -1) { printf("Invalid expression!\n"); exit(0); } return e.value; } ``` 到这里,我们就完成了用堆栈和队列实现计算器仿真的代码。你可以尝试输入一些表达式进行测试。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值