逆波蘭中綴轉字尾表示式並求值

2021-09-29 05:59:47 字數 3444 閱讀 7396

建立鏈棧

「linkstack.h」

#pragma once

typedef int elemtype;

typedef struct _node

node;

typedef struct _linkstack

linkstack,*ptrstack;

//初始化

void init(ptrstack stack);

//入棧1

void push(ptrstack stack,int val);

//出棧1

void pop(ptrstack stack,int *val);

//入棧2

void push1(ptrstack stack,char ptr);

//出棧2

void pop1(ptrstack stack,char *ptr);

//清空

void clear(ptrstack stack);

//銷毀

void destroy(ptrstack stack);

//字尾表示式求值

int rpn_num(ptrstack stack,char *str);

//中綴轉字尾

void rpn_change(ptrstack stack,char *str,char *brr);

.cpp

#include"linkstack.h"

#include#include#include#include#include#includevoid init(ptrstack stack)

stack->head.next=null;

}void push(ptrstack stack,int val)

node* newnode=(node*)malloc(sizeof(node));

newnode->data=val;

newnode->next=stack->head.next;

stack->head.next=newnode;

}void pop(ptrstack stack,int *val)

if(stack->head.next==null)

node* q=stack->head.next;

*val=q->data;

stack->head.next=q->next;

free(q);

q=null;

}void push1(ptrstack stack,char ptr)

node* newnode=(node*)malloc(sizeof(node));

newnode->ptr=ptr;

newnode->next=stack->head.next;

stack->head.next=newnode;

}void pop1(ptrstack stack,char *ptr)

if(stack->head.next==null)

node* q=stack->head.next;

*ptr=q->ptr;

stack->head.next=q->next;

free(q);

q=null;

}

中綴轉字尾:

例如:9 + ( 3 - 1 )* 10+ 10 / 2 —> 9 3 1 - 10 * + 10 2 / +

思想:1.迴圈遍歷字串:

(1)遇到數字或者空格就直接輸出(這裡輸出是指將其儲存在額外給的陣列裡)

(2)否則:

遇到加減:如果棧為空就壓棧,不為空則判斷與棧頂元素的優先順序,因為加減小於乘除,而且同級別也需要輸出的關係,即只要棧頂元素為加減乘除的任意乙個,就迴圈出棧並輸出,直到棧為空。

遇到乘除或者左括號,就直接壓棧。

遇到右括號,就將棧中元素依次出棧並輸出,直到遇到左括號。同時再將左括號出棧。

2.遍歷結束之後,因為棧中可能依然有元素的關係,我們需要依次出棧並輸出。

void rpn_change(ptrstack stack,char *str,char *brr)

int i=0,j=0;

char p;

while(str[i]!='\0')

else if(str[i]==' ')

else

else

}push1(stack,str[i]); }}

else if(str[i]==')')

pop1(stack,&p);

}else if(str[i]=='*'||str[i]=='/'||str[i]=='(')

i++;

} }while(stack->head.next!=null)

brr[j]='\0';

}

字尾表示式求值:

思想:1.迴圈遍歷字串:

(1)遇到數字就直接壓棧;因為是字元的關係,為了以免而會將原先乙個數字字元分成兩個字元,需要用乙個標記記錄當前這個是數字並儲存值,下一次迴圈再次遇到數字時,就用儲存的值*10+當前的數字。

(2)遇到空格就直接輸出。

(3)遇到符號就將棧頂的兩個元素出棧,第乙個作為right,第二個作為left,然後將他們計算得出的值壓棧。

int rpn_num(ptrstack stack,char *str)

int num=0;

int i=0;

int left,right;

int ***=-1,count=0;

while(str[i]!='\0')

else if(***==1)

}else if(str[i]=='+')

else if(str[i]=='-')

else if(str[i]=='*')

else if(str[i]=='/')

else if(str[i]==' ')

}pop(stack,&num);

return num;

}

測試

linkstack p;

init(&p);

char str="9 + ( 3 - 1 ) * 10 + 10 / 2";

char *brr=new char[strlen(str)+1]();

rpn_change(&p,str,brr);

printf("%s\n",brr);

//char str="9 3 1- 3 * + 10 2 / +";

int num=rpn_num(&p,brr);

printf("%d\n",num);

中綴表示式轉字尾(逆波蘭)表示式

原則 從左到右遍歷中綴表示式 1 如果是數字則直接輸出 2 如果是左括號,直接入棧 3 如果是右括號,直接棧頂元素出棧並輸出,直到遇到左括號,左括號只出棧,不輸出 4 如果是符號,如果優先順序不高於棧頂符號則棧頂元素依次出棧並輸出 如果遇到 符號,如果棧非空並且棧頂元素不是左括號,則出棧並且輸出,否...

中綴表示式轉字尾表示式,並求值

資料結構之棧的應用 先實現求值這一步吧,已知字尾表示式 轉換這一環節待更新 上 中綴表示式轉字尾表示式 seqstack 以及求值 version 1.0 求值,需要自己輸入字尾表示式 2.0 加上轉化功能 演算法 建立乙個運算元棧,自左向右遍歷字尾表示式,遇到乙個運算元就入棧,遇到乙個操作符就從棧...

逆波蘭計算 中綴轉字尾 字尾表示式計算

我們利用棧將中綴表示式轉換為字尾表示式 逆波蘭表示式 來計算表示式 此程式支援整數運算 遍歷中綴表示式,遇到運算元就輸出,遇到符號就壓入棧中 棧中的運算子為掛起狀態 但是操作符的壓棧出棧有如下規則 碰到運算元壓入棧中,碰到運算子提取棧頂兩個元素進行相應的操作,將運算元壓入棧中,直到整個表示式遍歷完成...