好不容易抽出点时间来复习一下数据结构和算法。
看到堆栈部分。有2道题目,第一道是计算C系列括号匹配校验。第二道是计算算数表达式。
第一道题是思路是
跳过 ' ""字符串,/* // 注释以后。
如果发现{, [, ( 那么入栈,发现 },],) 以后出栈,对比是否匹配。
文件检查完以后,堆栈内为空,说明匹配成功。
(ps一句,很多代码是抄的)
第二道题思路
首先把中缀式转换为后缀式。
转换过程
1)若读入的是操作数,入到输出栈
2)读入的是闭括号,把操作栈中的运算符依次出栈,推入输出栈,一直遇到对应开括号为止,把开括号出栈
3)读入的开括号,进运算符栈
4)读入的是运算符,如果运算符栈优先级高,堆栈运算符出栈,出栈操作一直要进行到栈顶运算符优先级低为止,然后把新的运算符入栈
5)在读入操作符结束扣,把运算符栈中所有剩余运算符依次出栈,放入输出栈
6)计算输出堆表达式的
直接发代码.
先发堆栈的。
#ifndef __ListDemo__List__
#define __ListDemo__List__
#include <iostream>
template <typename T>
class ListNode
{
public:
T element;
ListNode<T> *next;
public:
ListNode(T te, ListNode<T> *L):element(te), next(L){}
ListNode(T te):element(te), next(NULL){}
};
template <typename T>
class Stack {
private:
ListNode<T> *head;
public:
const int isEmpty() const;
void push(T x);
T pop();
T top();
};
template <typename T>
const int Stack<T>::isEmpty() const
{
return head == NULL;
}
template <typename T>
void Stack<T>::push(T x)
{
if (head == NULL)
{
head = new ListNode<T>(x);
}
else
{
ListNode<T> *p = new ListNode<T>(x, head);
head = p;
}
}
template <typename T>
T Stack<T>::pop()
{
if (head == NULL)
{
// return NULL;
}
ListNode<T> *p = head->next;
T x = head->element;
delete head;
head = p;
return x;
}
template <typename T>
T Stack<T>::top()
{
if (head == NULL)
{
// return NULL;
}
return head->element;
}
#endif /* defined(__ListDemo__List__) */
第一道题:
#ifndef ListDemo_CheckFlag_h
#define ListDemo_CheckFlag_h
#include <iostream>
#include "List.h"
struct Symbol {
char Token;
int Theline;
};
class CheckFlag
{
private:
enum CommonentType { SlashSlash, SlashStar }; // // or /*
istream & InputStream;
char Ch;
int CurrentLine;
Stack<Symbol> PendingTokens; //没有处理的开括号
int Errors;
private:
int NextChar(); //下1个字符
void PutBackChar(); //把当前字符放回输入流
void SkipComment(CommonentType Start); //跳过 // /*
void SkipQuote(char QuoteType); //跳过 '' 和 ""
char GetNextSymbol();